如何在大型C ++项目中检测编译时的瓶颈?

时间:2012-05-14 05:13:18

标签: c++ visual-studio visual-studio-2008 compiler-optimization

我想减少大型C ++项目的编译时间。 我试图使用预编译的头文件,接口等。 但在我继续之前,我想知道是否有任何有助于检测编译时间的工具是如此之长。 有人建议使用pc-lint,我会试一试。 How should I detect unnecessary #include files in a large C++ project? 但是,如果有其他工具可以分析编译时间并讨论任何提高编译速度的提示,请告诉我。 提前谢谢。

环境:Microsoft Visual Studio C ++ 2008或2010。

4 个答案:

答案 0 :(得分:5)

我喜欢的一种方法是查看一些源的预处理器输出 - 只是从编译器的角度阅读其中的一些,而不是有点抽象的表示#inclu sion。你可能会发现一些你不需要的大块包含/库,并且不一定知道依赖/包含的存在(或需要)。从那里,决定可以删除哪些依赖项。即使您的依赖关系都是正确的,大输出也可以建议您如何将更大的模块划分为更小的部分。

答案 1 :(得分:4)

C ++ 是模块化的(但是),编译瓶颈通常是由于包含问题;在不需要时使用包含太多文件的文件。目前还可能需要,但是通过一些简单的重新设计可能会变得多余。

  • 要检测多余的内容,您可以查看include-what-you-use,唯一的问题是它在Clang上运行,因此您需要在那里进行一些设置。
  • 否则,您需要检查您的代码,特别是标题

由于该工具是自给自足的并且有文档记录,所以让我对评估过程进行一些扩展。

  1. 任何超过一对#include的标头都非常可疑。
  2. 相反,如果你有一个充满各种类型和功能的源文件,它只有一对包含,这可能意味着其中一个标题带来了太多。
  3. 如果您无法了解需要什么,什么不需要,以及如何删除多余的标题,我建议您阅读Pimpls - Beauty Marks You Can Depend On;如果您不知道Pimpl是什么,请阅读Compilation Firewalls。我建议谨慎,Pimpl有运行时和维护成本,所以只有在必要时才使用它。就个人而言,我绝对会在你提供给第三方(ABI兼容性)的图书馆的公共标题中推荐它,否则会尽量避免它。

    如果手动检查不是您的强项,您可以为每个标题生成预处理器输出(不要过多担心源文件),并检查更大的输出。

答案 2 :(得分:3)

我不知道有任何改进编译时间的工具,但很少有人工补救措施,我可以建议(将其视为评论):

  1. 每个头文件都有#include防护,因此多个 包含不会有任何问题
  2. 直接减少成员函数体,内联函数体 进入头文件;只是有他们的声明
  3. 检查是否没有不必要的template函数和类; 请记住,默认情况下,tempaltes变为inline。太多了 模板/元编程会导致巨大的编译时间。
  4. 如果#define的数量不必要地高,那么他们会 增加预处理阶段,最终增加 编译时间

答案 3 :(得分:1)

您可以查看unity builds.
基本上它将所有.cpp文件包含在一个.cpp文件中,并且仅编译该文件。 我在一个大项目上测试了它,它真的很有效 它的工作原理是因为它包含所有标题/ cpp一次而不是每个cpp使用的I / O少得多。

现在我们不再使用Unity版本,因为我们都进行了SSD硬件升级,而且它们非常棒。

以下是有关Unity版本的相关问题:#include all .cpp files into a single compilation unit?