可以使用哪些技术来加快c++编译时间?

这个问题出现在一些关于Stack Overflow问题c++编程风格的评论中,我很有兴趣听听有什么想法。

我看到过一个相关的问题,为什么c++编译要花这么长时间?,但这并没有提供很多解决方案。


当前回答

虽然不是一个“技术”,我不知道Win32项目与许多源文件编译速度比我的“Hello World”空项目。因此,我希望这能帮助到像我这样的人。

在Visual Studio中,增加编译时间的一个选项是增量链接(/ Incremental)。它与链接时代码生成(/LTCG)不兼容,因此在进行版本构建时请记住禁用增量链接。

其他回答

升级你的电脑 获得一个四芯(或双四芯系统) 获得大量的内存。 使用RAM驱动器可以大大减少文件I/O延迟。(有些公司生产的IDE和SATA RAM驱动器就像硬盘驱动器一样)。 然后你有了所有其他典型的建议 如果可用,使用预编译头文件。 减少项目各部分之间的耦合。更改一个头文件通常不需要重新编译整个项目。

以下是一些例子:

通过启动一个多编译作业(make -j2就是一个很好的例子)来使用所有处理器内核。 关闭或降低优化(例如,GCC使用-O1时比使用-O2或-O3时快得多)。 使用预编译的头文件。

在Linux(也许还有其他一些* nix)上,您可以通过不盯着输出并更改到另一个TTY来加速编译。

下面是实验:printf使我的程序变慢

使用动态链接而不是静态链接会让你的编译器更快。

如果你使用t Cmake,激活属性:

set(BUILD_SHARED_LIBS ON)

Build Release,使用静态链接可以得到更多的优化。

我将链接到我的另一个答案:如何减少Visual c++项目(原生c++)的编译时间和链接时间?我想补充的另一点是使用预编译的头文件,这经常会导致问题。但是,请只将它们用于几乎不会改变的部分(如GUI工具箱头)。否则,他们会花费你更多的时间,而不是他们最终节省你的时间。

另一个选项是,当你使用GNU make时,打开-j<N>选项:

  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.

我通常把它设置为3,因为我这里有一个双核。然后,它将为不同的翻译单元并行运行编译器,前提是它们之间没有依赖关系。链接不能并行完成,因为只有一个链接器进程将所有目标文件链接在一起。

但是链接器本身可以被线程化,这就是GNU gold ELF链接器所做的。它是优化的多线程c++代码,据说它链接ELF对象文件的速度比旧的ld快很多(实际上包含在binutils中)。