我想减少大型C ++项目的编译时间。 我试图使用预编译的头文件,接口等。 但在我继续之前,我想知道是否有任何有助于检测编译时间的工具是如此之长。 有人建议使用pc-lint,我会试一试。 How should I detect unnecessary #include files in a large C++ project? 但是,如果有其他工具可以分析编译时间并讨论任何提高编译速度的提示,请告诉我。 提前谢谢。
环境:Microsoft Visual Studio C ++ 2008或2010。
答案 0 :(得分:5)
我喜欢的一种方法是查看一些源的预处理器输出 - 只是从编译器的角度阅读其中的一些,而不是有点抽象的表示#inclu
sion。你可能会发现一些你不需要的大块包含/库,并且不一定知道依赖/包含的存在(或需要)。从那里,决定可以删除哪些依赖项。即使您的依赖关系都是正确的,大输出也可以建议您如何将将更大的模块划分为更小的部分。
答案 1 :(得分:4)
C ++ 不是模块化的(但是),编译瓶颈通常是由于包含问题;在不需要时使用包含太多文件的文件。目前还可能需要,但是通过一些简单的重新设计可能会变得多余。
由于该工具是自给自足的并且有文档记录,所以让我对评估过程进行一些扩展。
#include
的标头都非常可疑。如果您无法了解需要什么,什么不需要,以及如何删除多余的标题,我建议您阅读Pimpls - Beauty Marks You Can Depend On;如果您不知道Pimpl是什么,请阅读Compilation Firewalls。我建议谨慎,Pimpl有运行时和维护成本,所以只有在必要时才使用它。就个人而言,我绝对会在你提供给第三方(ABI兼容性)的图书馆的公共标题中推荐它,否则会尽量避免它。
如果手动检查不是您的强项,您可以为每个标题生成预处理器输出(不要过多担心源文件),并检查更大的输出。
答案 2 :(得分:3)
我不知道有任何改进编译时间的工具,但很少有人工补救措施,我可以建议(将其视为评论):
#include
防护,因此多个
包含不会有任何问题template
函数和类;
请记住,默认情况下,tempaltes变为inline
。太多了
模板/元编程会导致巨大的编译时间。#define
的数量不必要地高,那么他们会
增加预处理阶段,最终增加
编译时间答案 3 :(得分:1)
您可以查看unity builds.
基本上它将所有.cpp
文件包含在一个.cpp文件中,并且仅编译该文件。
我在一个大项目上测试了它,它真的很有效
它的工作原理是因为它包含所有标题/ cpp一次而不是每个cpp使用的I / O少得多。
现在我们不再使用Unity版本,因为我们都进行了SSD硬件升级,而且它们非常棒。
以下是有关Unity版本的相关问题:#include all .cpp files into a single compilation unit?