C++ 如何找到编译瓶颈?

C++ 如何找到编译瓶颈?,c++,visual-studio-2008,visual-c++,compilation,C++,Visual Studio 2008,Visual C++,Compilation,我如何发现代码的哪些部分需要花很长时间编译 我已经在为我的所有头文件使用预编译头文件,它们无疑提高了编译速度。然而,每当我对C++源文件进行修改时,编译它花费很长时间(这是CPU /内存绑定的,不是I/O绑定的——它都被缓存)。此外,这与链接部分无关,只与编译部分有关 我已经尝试打开了/showIncludes,但当然,因为我使用的是预编译的头文件,所以在stdafx.h之后没有包含任何内容。所以我知道只是源代码需要一段时间来编译,但我不知道它的哪一部分 我也尝试过做一个最小的构建,但是没有帮助

我如何发现代码的哪些部分需要花很长时间编译

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


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

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

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

有没有更好的方法来找出是什么减慢了编译速度

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


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

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

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

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

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

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

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

  • 使用前向声明(仅在源文件中包含标题),而不是在标题中包含标题
  • 最小化模板化代码(如果可以避免使用模板)
只有这两条规则才能大大缩短构建时间

<>你可以在LakOS中找到更多的“大规模C++软件设计”。
对于VisualStudio(我不确定它是否太旧),请查看以下内容:

编译模板代码通常需要更长的时间

您可以研究使用“编译器防火墙”,这可以减少生成.cpp文件的频率(由于前向声明,它们还可以减少读取包含文件的时间)


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

“但是,当然,由于我使用的是预编译头,所以stdafx.h之后不会包含任何内容。”仅仅因为您使用了预编译头,并不意味着您将所有内容都粘贴在PCH中。你把常用的东西以及需要很长时间编译的东西放在那里。代码可以被重构成多个源文件吗?单个CPP文件的速度是多少?是的,这正是我正在做的。什么都没有了…@sehe:我从来没有在VS2008上看到过。您不能在PCH之前包含文件(或执行任何操作),但通常可以在PCH之后包含您想要的任何内容。我一直都在这样做,我在一个项目中PCH了一堆库头(Boost),但是在该项目中定义的头不在PCH中。这对我来说很好。有趣的是,我不可能猜到第一个。知道为什么会有帮助吗?因为这可能会导致一些不必要的头包含在不需要它们的源文件中。它们仍然需要编译器读取和解析。我很确定我需要包括在内的所有内容,但是+1,谢谢。