我倾向于编写相当大的模板化纯标题头C ++库,我的用户通常抱怨编译时间。在考虑了这个问题之后,我想到我不知道时间在哪里。是否有一些简单的方法可以用通用编译器(例如g ++,icc和xlC)来分析C ++编译过程?例如,是否可以了解在each of the phases of C++ compilation中花费了多少时间?
对于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]之前的[[较古老),请参见此线程中的其他选项。
我尚未尝试过,但是临时灯看起来非常有前途:visualizing
您可以将它们分开一定程度(我假设是https://github.com/mikael-s-persson/templight)
make
开关),并且依赖于预处理器输出文件的-E
目标就像普通的二进制目标依赖于.PHONY
文件一样。测量建立此目标需要多长时间].o
文件但不链接它们的'PHONY
目标。测量构建此目标需要花费多长时间(从干净开始)现在您已经知道预处理,编译和链接需要多长时间。您还可以比较第二个目标和第三个目标的优化版本和非优化版本(.o
),以了解优化器花费了多长时间。
[至少对于分解成许多进程的g ++之类的编译器,您可能可以在-O0
上使用某些变体来吸引他们的注意。
[其他人已经建议了GCC的strace -e trace=process -f -r -ttt -T
命令行标志,这使编译器可以打印一些有关每个编译阶段所用时间的统计信息。缺点是只显示一个单元的摘要。
我已经编写了Python -ftime-report
,它允许在给定项目构建日志文件的情况下,在每个编译阶段按所有打印阶段在所有单元上显示总计摘要。它还允许按不同阶段排序。并且它还允许比较两个日志文件(例如,如果您要了解所做更改的影响)。
Clang 9(及更高版本)具有-ftime-report
标志,这使其以JSON(除目标文件的形式)输出性能分析报告。
您可以将此文件导入Chrome(script)随附的分析器中,以得到很好的可视化效果:
-ftime-trace
这些条对应于必须解析的标头,对于每个标头,必须解析特定的类(可能还有其他构造)。它还报告了在实例化特定模板上花费的时间。