c++ - 如何找到编译瓶颈?

标签 c++ visual-studio-2008 visual-c++ compilation

我如何找到代码的哪些部分需要很长时间才能编译?

我已经为我的所有头文件使用了预编译头文件,它们肯定会提高编译速度。然而,每当我对我的 C++ 源文件进行更改时,编译它都需要很长时间(这是 CPU/内存绑定(bind)的,不是 I/O 绑定(bind)的——它都被缓存了)。此外,这与链接部分有关,仅与编译部分有关。

我尝试打开 /showIncludes,但当然,由于我使用的是预编译头文件,所以在 stdafx.h 之后没有包含任何内容。所以我知道只是源代码需要一段时间才能编译,但我不知道它的哪一部分。

我也尝试过进行最小化构建,但没有帮助。 /MP 也没有,因为它无论如何都是一个源文件。

我可以尝试剖析源代码并通过添加/删除它来找出哪个部分是瓶颈,但这很痛苦并且无法扩展。此外,很难删除某些内容并仍然让代码编译——如果有错误消息,几乎会立即返回。

有没有更好的方法来找出导致编译速度变慢的原因?

或者,如果没有办法:是否有任何语言结构(例如模板?)需要更长的编译时间?


我的 C++ 源代码中有什么:

  • 三个(相对较大的)ATL 对话框类(包括定义/逻辑)。

    它们很可能是原因,但无论如何它们都是程序的核心部分,所以很明显,每当我更改它们时,它们需要重新编译。

  • 随机的单行(或类似的小)实用函数,例如字节数组到十六进制转换器

  • 对在我的头文件中找到的(内联)类的引用。 (其中一个头文件很大,但它只使用最少的模板,当然它是预编译的。另一个是 TR1 regex - 它很大,但几乎没有使用。)

注意:

我正在寻找技术,我可以更广泛地应用于找出这些问题的原因,不是针对我的特殊情况的具体建议。希望这对其他人也更有用。

最佳答案

两种提高编译时间的通用方法:

  • 不要在 header 中包含 header ,而是使用前向声明(仅在源文件中包含 header )
  • 尽量减少模板代码(如果可以避免使用模板)

只有这两条规则会大大缩短您的构建时间。

您可以在 Lakos 的“大规模 C++ 软件设计”中找到更多技巧。

对于visual studio(我不确定它是否太旧),看看这个:How should I detect unnecessary #include files in a large C++ project?

关于c++ - 如何找到编译瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107004/

相关文章:

c++ - 在另一台计算机上运行 a.out

c++ - TBB parallel_for:为什么 Body::operator() 参数不是 const?

c - 尝试一起编译多个 CUDA 文件时出现链接错误 LNK2005

visual-studio-2008 - 在同一解决方案上交叉链接不同项目时,Visual Studio 2008 上的 C++ 链接问题

C++ 构造函数和静态成员

c++ - cocos2d-x 3.6 如何调用ScrollView 的addEventListener?

c++ - 使用 boost to_lower & trim 时出现 gcc 链接器错误

c++ - 基本 C++ 程序崩溃 VS 2008

c++ - `snprintf_s` 错误的安全感

visual-c++ - 我如何分发 msvr71.dll (microsoft visual c++ runtime dll)