我如何找到代码的哪些部分需要很长时间才能编译?
我已经为我的所有头文件使用了预编译头文件,它们肯定会提高编译速度。然而,每当我对我的 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/