我倾向于编写相当大的模板化仅标头 C++ 库,而我的用户通常抱怨编译时间。想了想这件事,我突然想到,我不知道时间都去哪儿了。是否有一些简单的方法可以使用常见的编译器(例如 g++、icc 和 xlC)来分析 C++ 编译过程?例如,是否有可能了解C++ 编译的每个阶段花费了多少时间?
8 回答
对于GCC,有调试选项可供查找how much time is spent within each of the phases of C++ compilation?
-Q 使编译器在编译时打印出每个函数名称,并在完成时打印有关每个传递的一些统计信息。
-ftime-report 使编译器在完成时打印有关每次传递所消耗时间的一些统计信息。
Passes 在GCCINT 9: Passes and Files of the Compiler中有描述。
-v -ftime-report
您可以在此处发布单个源文件的 g++ 编译的输出以进行讨论。GCC邮件列表上可能会有一些帮助。
对于GCC 以外的编译器(或比3.3.6更古老的 GCC ),请参阅此线程中的其他选项。
我还没有尝试过,但 templight 看起来很有希望:https ://github.com/mikael-s-persson/templight
您可以在某种程度上将它们分开(我假设make
)
- 添加一个只预处理文件的构建规则(使用
-E
开关),以及一个.PHONY
依赖于预处理器输出文件的目标,就像普通的二进制目标依赖于.o
文件一样。衡量建立这个目标需要多长时间 - 添加一个
'PHONY
依赖于所有.o
文件但不链接它们的目标。测量构建这个目标需要多长时间(从干净) - 测量干净构建通常的二进制文件需要多长时间
现在您对预处理、编译和链接需要多长时间有所了解。您还可以比较第二个和第三个目标的优化和非优化 ( -O0
) 版本,看看在优化器中花费了多长时间。
strace -e trace=process -f -r -ttt -T
至少对于像 g++ 这样被分解为许多进程的编译器,您可能能够通过一些变体获得一些牵引力。
其他人已经建议了-ftime-report
GCC 的命令行标志,这使得编译器打印一些关于每个编译阶段消耗的时间的统计信息。缺点是它只显示一个单元的摘要。
我编写了一个 Python脚本,它允许在给定项目构建日志文件的情况下,在每个编译阶段打印所有单元的总摘要。它还允许按不同阶段进行排序。它还允许比较两个日志文件(例如,如果您试图了解更改的影响)。