分析C ++编译过程

问题描述 投票:76回答:7

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

c++ compilation profiling
7个回答
63
投票

对于GCC,有debugging options查找how much time is spent within each of the phases of C++ compilation?

-Q使编译器在编译时打印出每个函数名称,并在完成时打印有关每个遍历的一些统计信息。

-ftime-report使编译器打印一些有关每次遍历完成时所花费时间的统计信息。

通过在GCCINT 9: Passes and Files of the Compiler中描述。

您可以在此处将带有-v -ftime-report的单个源文件的g ++编译输出输出到discuss it。在GCC mailing list上可能会有帮助。


对于编译器GCC之外的编译器(或GCC C0]之前的[[较古老),请参见此线程中的其他选项。


14
投票

Boost项目中有3.3.6,对于几乎所有编译器和构建系统都可能有用。

该工具需要源代码工具,并带有a toolTEMPLATE_PROFILE_ENTER()宏调用。然后,这些宏在编译时生成特定的诊断(警告),并通过脚本将其与实例化调用堆栈(因此允许构建和TEMPLATE_PROFILE_EXIT()调用图)一起计时并收集。不错,IMO。

虽然我还没有使用它。


7
投票

我尚未尝试过,但是临时灯看起来非常有前途:visualizing


5
投票

您可以将它们分开一定程度(我假设是https://github.com/mikael-s-persson/templight

  • 添加仅对文件进行预处理的构建规则(使用make开关),并且依赖于预处理器输出文件的-E目标就像普通的二进制目标依赖于.PHONY文件一样。测量建立此目标需要多长时间]
  • 添加一个依赖于所有.o文件但不链接它们的'PHONY目标。测量构建此目标需要花费多长时间(从干净开始)
  • 测量完成通常的二进制文件的构建所需的时间

现在您已经知道预处理,编译和链接需要多长时间。您还可以比较第二个目标和第三个目标的优化版本和非优化版本(.o),以了解优化器花费了多长时间。


2
投票

[至少对于分解成许多进程的g ++之类的编译器,您可能可以在-O0上使用某些变体来吸引他们的注意。


0
投票

[其他人已经建议了GCC的strace -e trace=process -f -r -ttt -T命令行标志,这使编译器可以打印一些有关每个编译阶段所用时间的统计信息。缺点是只显示一个单元的摘要。

我已经编写了Python -ftime-report,它允许在给定项目构建日志文件的情况下,在每个编译阶段按所有打印阶段在所有单元上显示总计摘要。它还允许按不同阶段排序。并且它还允许比较两个日志文件(例如,如果您要了解所做更改的影响)。


0
投票

Clang 9(及更高版本)具有-ftime-report标志,这使其以JSON(除目标文件的形式)输出性能分析报告。

您可以将此文件导入Chrome(script)随附的分析器中,以得到很好的可视化效果:

-ftime-trace

这些条对应于必须解析的标头,对于每个标头,必须解析特定的类(可能还有其他构造)。它还报告了在实例化特定模板上花费的时间。

© www.soinside.com 2019 - 2024. All rights reserved.