【发布时间】:2013-03-02 14:43:00
【问题描述】:
我如何找出编译器在哪里花费时间?
我的构建太慢了,我已经为 VC++ 临时文件使用了 RAMdisk,但它没有任何区别。 (我有一个 SSD,所以我预计没有区别。)
此项目中的大多数单个 C++ 文件大约需要 10 分钟。 2 秒编译,这看起来很糟糕(因为我也没有任何项目内并行化,因为我使用的是 VS2005)。
我该如何优化呢?不进行分析就不要优化,但是如何分析编译器?
注意:这些并没有真正的帮助:
- Profiling the C++ compilation process
- Displaying build times in Visual Studio? (虽然它并非完全没有优点......如果您进行单文件编译,而不是整个项目,它将显示单个文件所花费的时间:这样我在这里看到了相当多的文件需要超过 5 秒,单机编译时甚至需要 10 秒)
让我们添加一个很好的评论:你有很多模板吗?您的文件平均有多大?你检查过只包含最少的必要标题
不,我没有。我当然可以(并且pro'lly会)。我也许能找到一些东西,但这都是推测和反复试验!
“Everybody”告诉你,你应该只在测量/分析之后进行优化,但是在优化编译时间时,我们又回到了试错?
注意:__TIME__ 的 cmets 提出的“hack”确实不有效,至少在 Visual-C++ 上无效,因为(如the docs 状态):当前源文件的最近编译时间。时间是 hh:mm:ss 形式的字符串文字。——我想至少可以用这个标记获得单个编译单元的计时,但它无助于深入研究一个编译单元.
【问题讨论】:
-
你有很多模板吗?您的文件平均有多大?你检查过只包含最少的必要标题吗?
-
你使用的是预编译头文件吗?
-
@MartinBa 使用“仅包括必要的最少标头”,这不是尝试和错误,而是一种很好的做法。关于文件的平均大小:编译器需要解析整个内容,因此文件大小显然存在性能限制。我建议使用增量构建系统,其中只重新编译更改的文件。那你真的不用担心编译时间长了。
-
您可以尝试将
#pragma message( "Starting " __TIME__ )和#pragma message( "Completed " __TIME__ )之类的东西放在您怀疑编译需要一段时间的地方 - 例如你有很多繁重的模板实例化 -
它不会让您直接回答“编译器在哪里花费时间?”,但查看预处理器输出可能会让您更好地了解“编译器尝试了多少工作”做什么?':stackoverflow.com/questions/277258/…
标签: c++ visual-c++ compiler-construction profiling build-time