分析C++编译过程

Jac*_*son 75 c++ profiling compilation

我倾向于编写相当大的模板化标头C++库,我的用户通常会抱怨编译时间.在想到这件事之后,我突然意识到我不知道时间会在哪里.是否有一些简单的方法来使用常见的编译器(例如g ++,icc和xlC)来分析C++编译过程?例如,是否可以了解在C++编译的每个阶段花费了多少时间?

osg*_*sgx 58

对于GCC,有一些调试选项可供查找how much time is spent within each of the phases of C++ compilation?

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

-ftime-report 使编译器在完成时打印一些关于每个传递所消耗的时间的统计信息.

通道GCCINT 9:编译器的通过和文件中描述.

你可以-v -ftime-report在这里发布单个源文件的g ++编译输出来讨论它.GCC 邮件列表可能会有一些帮助.


对于GCC以外的编译器(或比3.3.6 更古老的 GCC ),请参阅此线程中的其他选项.

  • PS:`-Q`输出可以被一些awk或perl脚本抓取,解析和分析; 或者您可以在控制台上观看功能名称打印,长时间暂停后打印的任何内容都很难编译. (2认同)

uli*_*tko 14

Boost项目中有一个工具,它可以用于几乎任何编译器和构建系统.

该工具需要源代码的仪器TEMPLATE_PROFILE_ENTER()TEMPLATE_PROFILE_EXIT()宏调用.然后,这些宏在编译时生成特定的诊断(警告),它们与实例化调用堆栈(由此允许通过脚本构建和可视化调用图)一起定时和收集.不错,IMO.

我虽然没有使用它.

  • 链接已失效。 (2认同)

Hol*_*Cat 13

Clang 9(和更新版本)有一个-ftime-trace标志,这使得它以 JSON 格式输出分析报告(除了目标文件)。

您可以将此文件导入 Chrome ( chrome://tracing)附带的分析器中以获得漂亮的可视化效果:

图片

条形对应于必须解析的标题,并且对于每个标题,必须解析特定的类(可能还有其他结构)。它还报告实例化特定模板所花费的时间。


Pau*_*nan 7

我还没有尝试过,但是温度看起来非常有希望:https://github.com/mikael-s-persson/templight


Use*_*ess 5

您可以在某种程度上将它们分开(我假设make

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

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

  • 如果您使用 clang/llvm,您可以使用类似的技术将前端 (clang) 与后端 (llvm-opt) 分开。在后端,您甚至可以转储优化器图并单独运行它们。在 gcc 中,您可以比较 -O0 和 -O3 之间的构建时间,并查看优化花费的时间与其他地方花费的时间之间的差异。然后,您可以有选择地启用优化器以查看哪个是最严重的违规者(如果有)。 (2认同)