如何找到编译瓶颈?

时间:2011-11-12 19:34:45

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

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

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

我尝试启用/showIncludes,但当然,因为我使用预编译的标头,所以stdafx.h之后不会包含任何内容。所以我知道只有源代码需要一段时间才能编译,但我不知道它的哪一部分。

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

我可以尝试通过添加/删除源代码来解析源代码并确定哪个部分是瓶颈,但这很痛苦并且无法扩展。此外,很难删除某些东西,仍然让代码编译 - 错误消息,如果有的话,几乎立即回来。

有没有更好的方法来弄清楚什么会减慢编译速度?

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


我的C ++源代码中包含的内容:

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

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

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

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

注意:

我正在寻找技术,我可以更一般地解决这些问题的原因,针对我的特定情况的具体建议。希望这对其他人也更有用。

2 个答案:

答案 0 :(得分:3)

两种改善编译时间的一般方法:

  • 而不是在标头中包含标头,使用前向声明(仅在源文件中包含标头)
  • 最小化模板化代码(如果可以避免使用模板)

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

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

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

答案 1 :(得分:1)

模板代码通常需要更长时间才能编译。

您可以使用“编译器防火墙”进行调查,这会降低必须构建的.cpp文件的频率(由于前向声明,它们也可以减少读取包含文件的时间)。 / p>

您还可以通过使用链接时代码生成和/或整个程序优化来将代码生成所花费的时间从编译器转移到链接器,但通常从长远来看会浪费时间。