剖析C ++编译过程

我倾向于编写相当大的模板化头文件C ++库,我的用户经常抱怨编译时间。 在想到这件事后,我想到了, 我不知道时间在哪里 。 有没有一些简单的方法来分析C ++编译过程与常见的编译器,如g ++,icc和xlC? 例如,是否有可能知道在C ++编译的每个阶段花了多less时间?

对于GCC ,有debugging选项来查找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),请参阅本主题中的其他选项。

Boost项目中有一个工具 ,对于任何编译器和编译系统都是有用的。

该工具需要使用TEMPLATE_PROFILE_ENTER()TEMPLATE_PROFILE_EXIT()macros调用的源代码工具 。 这些macros然后在编译时生成特定的诊断(警告),这些macros随着实例化调用堆栈(因此允许通过脚本来构build和可视化调用图)而被定时和收集。 不错,国际海事组织。

我虽然没有使用它。

你可以在一定程度上将它们分开(我假设)

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

现在你有一些想法预处理,编译和链接需要多长时间。 您还可以比较第二个和第三个目标的优化版本和非优化版本( -O0 ),以查看优化器花了多长时间。

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

你可能能够通过strace -e trace=process -f -r -ttt -T得到一些变体,至less对于像g ++这样的编译器来说,它们被分解成许多进程。