我倾向于写相当大的模板仅标头的C ++库和我的用户经常抱怨编译时间。 想着这件事之后,它发生,我认为我不知道在哪里的时候是怎么回事 。 有一些简单的方法来确定与通用的编译器,如G ++,ICC和方xIC C ++的编译过程? 举例来说,是有可能得到的内花费了多少时间的想法每个C ++编译的阶段 ?
Answer 1:
对于GCC有调试选项,找到how much time is spent within each of the phases of C++ compilation?
-Q使编译器打印出每个函数的名称,因为它被编译,并打印关于每遍了一些统计数据,当它完成。
-ftime报告使编译器打印有关每遍消耗当它完成的时候的一些统计数据。
通行证中描述的编译器的Passes和相关文件:GCCINT 9 。
您可以张贴的G ++单源文件的编译输出-v -ftime-report
在这里讨论这个问题 。 有可能是GCC的一些帮助的邮件列表 。
对于除GCC(海湾合作委员会或比更古老 其它编译器3.3.6 )看到这个线程的其他选项。
Answer 2:
有一个工具来自Boost的项目,这可能是几乎任何有用的编译器和构建系统。
该工具需要与源代码插 TEMPLATE_PROFILE_ENTER()
和TEMPLATE_PROFILE_EXIT()
的宏调用。 这些宏然后生成特定的诊断(警告)在编译时,这是定时的,用实例调用栈(这因此允许建设和沿收集可视化调用图)通过一个脚本。 不坏,IMO。
我没有用,虽然它尚未。
Answer 3:
我还没有尝试过,但templight看起来非常有前途: https://github.com/mikael-s-persson/templight
Answer 4:
你可以从他们分开在一定程度上(我假设make
)
- 添加生成规则,只有预处理文件(使用
-E
开关),以及.PHONY
依赖于预处理器的输出文件,就像正常的二进制目标取决于目标.o
文件。 衡量它需要多长时间来建立这个目标 - 添加一个
'PHONY
依赖于所有目标.o
文件,但不将它们链接。 衡量它需要多长时间来建立这个目标(自洁) - 测量需要多长时间做一个干净的构建通常二进制
现在你有一些想法需要多长时间进行预处理,编译和链接。 您还可以比较优化和非优化( -O0
第二和第三目标的)版本,看看多久优化花费。
Answer 5:
你也许能够得到一些牵引着一些变种strace -e trace=process -f -r -ttt -T
,至少对于如g ++编译器被分成许多过程。
文章来源: Profiling the C++ compilation process