可以使用哪些技术来加快c++编译时间?
这个问题出现在一些关于Stack Overflow问题c++编程风格的评论中,我很有兴趣听听有什么想法。
我看到过一个相关的问题,为什么c++编译要花这么长时间?,但这并没有提供很多解决方案。
可以使用哪些技术来加快c++编译时间?
这个问题出现在一些关于Stack Overflow问题c++编程风格的评论中,我很有兴趣听听有什么想法。
我看到过一个相关的问题,为什么c++编译要花这么长时间?,但这并没有提供很多解决方案。
当前回答
以下是一些例子:
通过启动一个多编译作业(make -j2就是一个很好的例子)来使用所有处理器内核。 关闭或降低优化(例如,GCC使用-O1时比使用-O2或-O3时快得多)。 使用预编译的头文件。
其他回答
以下是一些例子:
通过启动一个多编译作业(make -j2就是一个很好的例子)来使用所有处理器内核。 关闭或降低优化(例如,GCC使用-O1时比使用-O2或-O3时快得多)。 使用预编译的头文件。
网络共享将大大降低您的构建速度,因为查找延迟很高。对于像Boost这样的东西,它给我带来了巨大的不同,尽管我们的网络共享驱动器非常快。当我从网络共享切换到本地SSD时,编译一个玩具Boost程序的时间从大约1分钟缩短到1秒。
不是关于编译时间,而是关于构建时间:
如果在工作时必须重新构建相同的文件,请使用ccache 在构建文件上 使用忍者建造而不是制造。我目前正在编译一个项目 有~100个源文件和所有缓存的ccache。使需要 5分钟,忍者不到1分钟。
你可以用-GNinja从cmake生成忍者文件。
当我从大学毕业时,我看到的第一个真正有生产价值的c++代码有这些神秘的#ifndef…#endif指令在它们之间定义头文件的地方。我以一种非常天真的方式问了那个写代码的人关于这些重要的东西,他被介绍给了大规模编程的世界。
回到正题,当谈到减少编译时间时,使用指令来防止重复的头定义是我学到的第一件事。
有一种技术在过去对我来说非常有效:不要独立编译多个c++源文件,而是生成一个包含所有其他文件的c++文件,就像这样:
// myproject_all.cpp
// Automatically generated file - don't edit this by hand!
#include "main.cpp"
#include "mainwindow.cpp"
#include "filterdialog.cpp"
#include "database.cpp"
当然,这意味着您必须重新编译所有包含的源代码,以防任何源代码发生更改,因此依赖关系树变得更糟。但是,将多个源文件编译为一个翻译单元更快(至少在我使用MSVC和GCC的实验中),并且生成更小的二进制文件。我还怀疑编译器被赋予了更大的优化潜力(因为它可以一次看到更多代码)。
这种技术在各种情况下都会失效;例如,如果两个或多个源文件声明了同名的全局函数,编译器就会退出。我在其他答案中找不到这个技巧,这就是为什么我在这里提到它。
不管怎样,KDE项目从1999年起就使用了这种完全相同的技术来构建优化的二进制文件(可能是为了发布)。转换到构建配置脚本的过程叫做——enable-final。出于对考古的兴趣,我翻出了宣布这个功能的帖子:http://lists.kde.org/?l=kde-devel&m=92722836009368&w=2