88

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

4

8 回答 8

71

对于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 ),请参阅此线程中的其他选项。

于 2014-02-18T17:36:03.210 回答
17

Clang 9(和更新的版本)有一个-ftime-trace标志,它可以将分析报告输出为 JSON(除了一个目标文件)。

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

图片

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

于 2020-05-16T15:46:56.877 回答
15

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

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

不过我还没用过。

于 2014-02-17T18:01:27.933 回答
7

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

于 2015-10-21T17:03:35.283 回答
5

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

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

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

于 2012-11-26T10:28:13.427 回答
2

strace -e trace=process -f -r -ttt -T至少对于像 g++ 这样被分解为许多进程的编译器,您可能能够通过一些变体获得一些牵引力。

于 2012-12-01T19:26:47.347 回答
1

Externis是一个 GCC 插件,它将生成非常类似于 clang 的跟踪文件-ftime-trace

在此处输入图像描述

免责声明:我是这个插件的作者。

于 2022-02-08T22:26:42.590 回答
1

其他人已经建议了-ftime-reportGCC 的命令行标志,这使得编译器打印一些关于每个编译阶段消耗的时间的统计信息。缺点是它只显示一个单元的摘要。

我编写了一个 Python脚本,它允许在给定项目构建日志文件的情况下,在每个编译阶段打印所有单元的总摘要。它还允许按不同阶段进行排序。它还允许比较两个日志文件(例如,如果您试图了解更改的影响)。

于 2020-05-16T15:28:15.093 回答