我倾向于编写相当大的仅模板头的C ++库模板,而我的用户通常抱怨编译时间。在考虑了这个问题之后,我想到我不知道时间在哪里。是否有一些简单的方法可以用通用编译器(例如g ++,icc和xlC)来分析C ++编译过程?例如,是否有可能了解在C ++编译的每个阶段中花费了多少时间?
我倾向于编写相当大的仅模板头的C ++库模板,而我的用户通常抱怨编译时间。在考虑了这个问题之后,我想到我不知道时间在哪里。是否有一些简单的方法可以用通用编译器(例如g ++,icc和xlC)来分析C ++编译过程?例如,是否有可能了解在C ++编译的每个阶段中花费了多少时间?
Answers:
-Q
可以通过某些awk或perl脚本来获取,解析和分析输出;或者您可以只看控制台上的函数名称打印,长时间暂停后打印的所有内容都很难编译。
gcc/toplev.c
(announce_function
-“解析函数定义的开始时,此函数在stderr上打印函数的名称”)。这announce_function
可能是添加打印时间戳记(gettimeofday)或以某种非缓冲方式重写输出的关键。或者另一种可能的方式是启用调试转储(-fdump-rtl-all-all
-fdump-tree-all-all
-fdump-ipa-all-all
),但它们每遍将输出1个文件;您需要将它们转换为每个遍历和每个函数输出1个文件(随着创建时间获得很多文件)。
我尚未尝试过,但templight看起来非常有前途:https : //github.com/mikael-s-persson/templight
您可以在一定程度上将它们分开(我假设是make
)
-E
开关),以及.PHONY
依赖预处理器输出文件的目标,就像普通的二进制目标依赖.o
文件一样。测量建立此目标需要多长时间'PHONY
依赖于所有.o
文件但不链接它们的目标。测量建立此目标所需的时间(从干净的角度看)现在您已经知道预处理,编译和链接需要多长时间。您还可以比较-O0
第二个和第三个目标的优化和非优化()版本,以了解在优化器中花费了多长时间。
其他人已经建议使用-ftime-report
GCC的命令行标志,这使编译器可以打印一些有关每个编译阶段所用时间的统计信息。缺点是只显示一个单元的摘要。
我已经编写了一个Python脚本,该脚本可以在给定项目构建日志文件的情况下,在每个编译阶段按所有单位打印总摘要。它还允许按不同阶段排序。而且它还允许比较两个日志文件(例如,如果您试图了解更改的影响)。