我如何找出为什么g ++在特定文件上花费很长时间?

Sch*_*amp 17 c++ performance profiling g++

我正在构建大量自动生成的代码,包括一个特别大的文件(~15K行),在linux上使用mingw32交叉编译器.大多数文件非常快,但是这个大文件需要很长时间(约15分钟)才能编译.

我试过操纵各种优化标志,看看它们是否有任何效果,没有任何运气.我真正需要的是一些确定g ++正在做什么的方法.是否有任何(相对简单的)方法让g ++生成关于不同编译阶段的输出,以帮助我缩小挂起的范围?

遗憾的是,我没有能力重建这个交叉编译器,因此不可能将调试信息添加到编译器并单步调试.

文件中有什么:

  • 一堆包括
  • 一堆字符串比较
  • 一堆if-then检查和构造函数调用

该文件是用于生成特定父类的大量不同特定子类的工厂.然而,大多数包括没有什么特别的花哨.


根据Neil Butterworth的建议,-ftime-report的结果表明,"生命分析"阶段需要921秒,占据了15分钟的大部分时间.

看起来这发生在数据流分析期间.文件本身是一堆条件字符串比较,按类名提供字符串构造对象.

我们认为将此更改为指向函数指针的名称映射可能会改善一些事情,因此我们将尝试这样做.


实际上,生成一堆工厂函数(每个对象)并从对象的字符串名称创建映射到指向其工厂函数的指针将编译时间从原来的15分钟缩短到大约25秒,这将节省每个人的大量时间在他们的构建上.

再次感谢Neil Butterworth关于-ftime-report的提示.

小智 25

不会提供您想要的所有细节,但尝试使用-v(详细)和-ftime-report标志运行.后者生成了编译器的最新信息.