我倾向于编写相当大的模板化标头C ++库,我的用户通常会抱怨编译时间。在考虑了这件事之后,我发现我不知道时间会在哪里。是否有一些简单的方法来使用常见的编译器(例如g ++,icc和xlC)来分析C ++编译过程?例如,是否可以了解在each of the phases of C++ compilation内花费了多少时间?
答案 0 :(得分:56)
对于 GCC ,有debugging options可以找到how much time is spent within each of the phases of C++ compilation?
<强> -Q 强> 使编译器在编译时打印出每个函数名称,并在完成时打印有关每个函数的一些统计信息。
<强> -ftime-报表 使编译器在完成时打印一些关于每个传递所消耗的时间的统计信息。
通行证在GCCINT 9: Passes and Files of the Compiler。
中描述您可以将-v -ftime-report
的单个源文件的g ++编译输出发布到discuss it。 GCC mailing list可能会有一些帮助。
对于GCC以外的编译器 (或GCC 更古老而不是3.3.6),请参阅此主题中的其他选项。
答案 1 :(得分:13)
Boost项目中有 a tool ,这对任何编译器和构建系统都很有用。
该工具需要源代码检测,并且需要TEMPLATE_PROFILE_ENTER()
和TEMPLATE_PROFILE_EXIT()
个宏调用。这些宏然后在编译时生成特定的诊断(警告),它们与实例化调用栈(因此允许构建和visualizing调用图)一起定时和收集。不错,IMO。
虽然我没有使用它。
答案 2 :(得分:8)
Clang 9(及更高版本)具有一个-ftime-trace
标志,这使其可以将概要分析报告输出为JSON(除了目标文件之外)。
您可以将此文件导入Chrome(chrome://tracing
)随附的分析器中,以得到很好的可视化效果:
https://codepen.io/flaccuz/pen/MWaPmYg
这些条对应于必须解析的标头,并且对于每个标头,必须解析特定的类(可能还有其他构造)。它还报告了在实例化特定模板上花费的时间。
答案 3 :(得分:6)
我还没有尝试过,但是温度看起来非常有希望:https://github.com/mikael-s-persson/templight
答案 4 :(得分:4)
您可以在某种程度上将它们分开(我假设make
)
-E
开关),以及依赖于预处理器输出文件的.PHONY
目标,就像普通二进制目标一样取决于.o
文件。衡量构建此目标所需的时间'PHONY
目标,该目标取决于所有.o
个文件但不链接它们。测量构建此目标所需的时间(来自干净)现在您已经知道预处理,编译和链接需要多长时间。您还可以比较第二个和第三个目标的优化和非优化(-O0
)版本,以查看在优化程序中花费了多长时间。
答案 5 :(得分:2)
您可能会对strace -e trace=process -f -r -ttt -T
上的某些变体有所了解,至少对于像g ++这样分解为多个进程的编译器而言。
答案 6 :(得分:0)
其他人已经建议了GCC的-ftime-report
命令行标志,这使编译器可以打印一些有关每个编译阶段所用时间的统计信息。缺点是只能显示一个单位的摘要。
我已经编写了Python script,该Python {{3}}允许在给定项目构建日志文件的情况下,在每个编译阶段按所有单元打印总摘要。它还允许按不同阶段排序。而且,它还允许比较两个日志文件(例如,如果您要了解所做更改的影响)。