分析C ++编译过程

时间:2012-11-26 06:39:16

标签: c++ compilation profiling

我倾向于编写相当大的模板化标头C ++库,我的用户通常会抱怨编译时间。在考虑了这件事之后,我发现我不知道时间会在哪里。是否有一些简单的方法来使用常见的编译器(例如g ++,icc和xlC)来分析C ++编译过程?例如,是否可以了解在each of the phases of C++ compilation内花费了多少时间?

7 个答案:

答案 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}}允许在给定项目构建日志文件的情况下,在每个编译阶段按所有单元打印总摘要。它还允许按不同阶段排序。而且,它还允许比较两个日志文件(例如,如果您要了解所做更改的影响)。