如何找到代码的哪些部分需要很长时间才能编译?
我已经在为所有标头使用预编译头文件,它们肯定会提高编译速度。然而,每当我更改我的C ++源文件时,编译它需要很长时间(这是CPU /内存绑定,不 I / O绑定 - 它都被缓存)。此外,这与链接部分 无关,只与编译部分有关。
我尝试启用/showIncludes
,但当然,因为我使用预编译的标头,所以stdafx.h
之后不会包含任何内容。所以我知道只有源代码需要一段时间才能编译,但我不知道它的哪一部分。
我也尝试过做一个最小的构建,但它没有帮助。 /MP
也没有,因为无论如何它都是一个源文件。
我可以尝试通过添加/删除源代码来解析源代码并确定哪个部分是瓶颈,但这很痛苦并且无法扩展。此外,很难删除某些东西,仍然让代码编译 - 错误消息,如果有的话,几乎立即回来。
有没有更好的方法来弄清楚什么会减慢编译速度?
或者,如果没有办法:是否有任何语言结构(例如模板?)需要花费更长的时间来编译?
我的C ++源代码中包含的内容:
三个(相对较大的)ATL对话框类(包括定义/逻辑)。
他们很可能是原因,但无论如何它们都是程序的核心部分,所以每当我更改它们时, 显然需要重新编译。
随机单行(或类似的小)实用函数,例如字节数组到十六进制转换器
在我的头文件中找到的(内联)类的引用。 (其中一个头文件是巨大的,但它只使用最少的模板,当然它是预编译的。另一个是TR1 regex
- 它很大,但它几乎没用过。)
我正在寻找技术,我可以更一般地解决这些问题的原因,不针对我的特定情况的具体建议。希望这对其他人也更有用。
答案 0 :(得分:3)
两种改善编译时间的一般方法:
只有这两条规则才能大大缩短您的构建时间。
你可以在Lakos的“大规模C ++软件设计”中找到更多技巧。
对于visual studio(我不确定它是否太旧),请看一下:How should I detect unnecessary #include files in a large C++ project?
答案 1 :(得分:1)
模板代码通常需要更长时间才能编译。
您可以使用“编译器防火墙”进行调查,这会降低必须构建的.cpp文件的频率(由于前向声明,它们也可以减少读取包含文件的时间)。 / p>
您还可以通过使用链接时代码生成和/或整个程序优化来将代码生成所花费的时间从编译器转移到链接器,但通常从长远来看会浪费时间。