我有一个庞大的项目,大约有150,000个LOC的C ++代码。建设时间约为15分钟。该项目由许多不同规模的子项目组成。
我为每个子项目构建了单独的预编译头,但是当我使用它们时,构建时间保持大致相同。似乎构建时间减少了5-10%,而不是更多。
绝对使用预编译头文件,我使用-Winvalid-pch
选项,我尝试使用-H
编译器选项进行编译,我的预编译头文件在输出中出现'bang'符号,这意味着编译器能够使用预编译的头文件。
我所有预编译的头文件都不是很大,每个文件大约是50Mb。 我使用python脚本,发现here生成最常用的预编译头文件列表,所以我的预编译候选列表非常好。
是否有用于构建优化的免费/开源工具?似乎标准make
实用程序无法测量不同目标的构建时间。我无法找到使用make
获取不同目标的统计信息的方法。我不是在谈论依赖性分析或者先进的东西。我只想知道大部分时间浪费在哪些目标上。
此外,似乎GCC在处理预编译头文件方面效率很低。我无法让任何子项目构建速度明显更快,我得到的最大加速比例是20%,对于一个需要三分钟构建的项目。使用固态驱动器购买速度更快的机器似乎比使用GCC优化Linux上的构建时间更简单,更便宜。
答案 0 :(得分:10)
GCC构建时间不会从预编译头文件中获益很多
是的,不幸的是,这通常是真的,
有一些实验项目可以做些更好的事情,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3426.html和http://gcc.gnu.org/wiki/pph,但它们尚无法使用。
我同意另一个答案,150KLOC的15分钟很慢。
我发现使用Gold链接器会对构建时间产生巨大影响,我强烈推荐它。
你也可以考虑ccache哪些可以提供帮助,如果你在其他机器上有空余周期distcc
避免在慢速磁盘上构建,当然要避免使用网络磁盘。避免递归调用make,这会花费更多时间来阅读makefile并重新创建依赖图。如果您可以构建子项目makefile,以便它们都可以包含在单个顶级makefile中,那么非递归make将需要更长时间才能开始,但是一旦它开始构建目标就会飞行。但是,重写makefile可能需要做很多工作。
这可能不言而喻,但建立在多核机器上并使用make -j N
,其中一个好的经验法则是N
应该是内核数量的两倍,或者如果编译是I / O绑定。
答案 1 :(得分:6)
如果您想充分利用此功能,您需要了解如何构建项目以充分利用它们。最好的方法是手动减少构建时间的缓慢而艰难的过程。一开始听起来真的很愚蠢,但是如果所有构建版本都快5倍,并且你知道如何构建你的项目和依赖关系 - 那么你就会意识到收益。
您可以使用目标设置持续集成系统,以便在您的更改进入时衡量并记录您的进度/改进。
我有一个庞大的项目,大约有150,000个LOC的C ++代码。建设时间约为15分钟。该项目由许多不同规模的子项目组成。
假设你有一台现代化的机器,听起来它正在做很多冗余的工作。
还要考虑链接时间。
我所有预编译的头文件都不是很大,每个文件大约有50Mb。
这很大,IMO。
我不是在谈论依赖性分析或其他先进的东西。
再次,统计数据的持续集成。对于缓慢的构建,过度的依赖很可能是问题(除非你有许多小的cpp文件,或者像物理内存耗尽一样愚蠢)。
我无法让任何子项目构建速度更快,我获得的最大加速是20%
了解您的结构和依赖关系。 PCH减慢了我的大多数项目。
使用固态硬盘购买速度更快的机器似乎比使用GCC优化Linux上的构建时间更容易,更便宜。
很可能,该机器不会使您的构建时间快20倍,但修复您的依赖项和项目结构可以使它快20倍(或者最终问题的根源)。机器只有这么多(考虑到150KSLOC的构建时间)。
您的构建可能是CPU /内存限制。
答案 2 :(得分:0)
我在生成和使用PCH时使用-include包含一个包含大量标题的文件。它有所帮助,但它仍然不那么令人印象深刻。
计算你的祝福:gcc似乎比MSVC快几倍,尽管MSVC有更好的PCH支持。
答案 3 :(得分:0)
目前,我正在尝试缩短项目的构建时间。该项目使用CMake和GCC,使用Boost大约有10万个LOC。
通过切换到预编译的头文件,我设法将构建机器上的构建时间从43分钟缩短到35分钟。我使用了-ftime-report
GCC标志来获取每个编译阶段的时间,还使用了辅助Python script对所有编译单元的时间进行求和。
这些时间帮助我理解了,向项目添加预编译头可能会大大减少解析和预处理阶段,但同时可能会大大增加代码生成和优化阶段。这是因为您将所有预编译的头数据添加到每个编译单元,并且编译器现在也需要处理该数据。根据这两个贡献,您可能会或不会从使用预编译的头文件中受益。