【问题标题】:How should I detect bottleneck of compile time in a large C++ project?我应该如何检测大型 C++ 项目中的编译时间瓶颈?
【发布时间】:2012-05-21 14:39:12
【问题描述】:

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

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

【问题讨论】:

  • 不是直接的答案,但您确实打开了并行构建?
  • 一般评论是不包括你不需要的标题。构建时最糟糕的事情是一个名为 includes.hpp 的头文件,其中包含您需要的所有可能的头文件。我已经看到了那个臃肿的重新编译时间。
  • 硬件升级怎么样?
  • 确保您有一个正确的构建系统,它只重建那些已更改的文件。然后你可以使用 PIMPL 之类的东西来最小化耦合和编译依赖的数量。
  • @David:我一直在这样做......当然,每个标题都配备了一个 '#ifndef foo \n #define foo ... #endif'。我不应该吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    由于该工具是自给自足的并且有文档记录,让我稍微扩展一下审核过程。

    1. 任何包含多个#include 的标头都是高度可疑的。
    2. 1234563

    如果您不知道什么是必需的,什么不是,以及如何删除多余的标题,我建议阅读Pimpls - Beauty Marks You Can Depend On;如果您不知道 Pimpl 是什么,请阅读 Compilation Firewalls。不过,我建议谨慎行事,Pimpl 具有运行时和维护成本,因此仅在确实需要时才使用它。就我个人而言,我绝对会在您提供给第三方的库的公共标头中推荐它(ABI 兼容性),否则尽量避免它。

    如果手动检查不是你的强项,你可以为每个 header 生成预处理器输出(不要太担心源文件),然后检查更大的输出。

    【讨论】:

      【解决方案3】:

      我不知道有任何工具可以改善编译时间,但我可以建议一些手动补救措施(将此视为评论):

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

      【讨论】:

        【解决方案4】:

        您可以查看unity builds.
        基本上它将所有.cpp 文件包含在一个.cpp 文件中,并且只编译该文件。 我已经在一个大项目上测试过它,它真的很有效。
        它之所以有效,是因为当它包含所有标头/cpp 一次而不是每个 cpp 时,它使用的 I/O 少得多。

        现在我们不再使用统一构建,因为我们都进行了 SSD 硬件升级,它们非常棒。

        这是一个关于 Unity 构建的相关 SO 问题:#include all .cpp files into a single compilation unit?

        【讨论】:

        • +1 - 关于 Unity Builds 的非常有趣的评论 - 下次我接触低级标题时,我将不得不尝试这样做。至于 SSD,我来晚了:只是在 HDD 崩溃后将它添加到笔记本电脑 - 速度增加表明我应该将编译框更改为 SSD。看完你的评论,我一定会做出改变,一旦容量高一点/价格便宜一点。
        猜你喜欢
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 2011-06-19
        • 2017-04-22
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多