在积极内联的情况下分析C ++?
我试图找出我的C ++程序在哪里花费时间,使用gprof。 这就是我的两难困境:如果我使用与我的发布版本相同的优化设置进行编译,几乎所有内容都被内联,并且gprof告诉我,90%的时间都花在核心例程中,其中一切都被内联了。 另一方面,如果我在禁用内联的情况下进行编译,程序运行速度会降低一个数量级。
我想知道当我的程序在启用内联编译时,我的核心例程中调用的过程需要多少时间。
我在四核英特尔机器上运行64位Ubuntu 9.04。 我研究了google-perftools,但是在x86_64上似乎并不适用。 在32位机器上运行不是一个选项。
有没有人有关于如何在启用内联时更有效地剖析我的应用程序的建议?
编辑:这是我的问题的一些澄清。 如果最初不清楚,我很抱歉。
我想找出在我的应用程序中花费的时间。 分析我的优化版本后,gprof告诉我,大约90%的时间都花在了主内容上,所有内容都在这里。 在分析之前我已经知道了!
我想知道的是内置函数需要多少时间,最好是不禁用优化或内联构建选项。 当内联停用时进行分析时,该应用程序的速度会降低一个数量级。 这种执行时间的差异是一个方便的问题,而且我也不确定禁用内联的程序的性能特征将与启用内联的程序的性能特征强烈对应。
简而言之:是否有一种方法可以在不禁用优化或内联的情况下获得有用的C ++程序分析信息?
我假设你想要做的是找出哪些代码行花费你足够值得优化。 这与定时功能非常不同。 你可以比gprof做得更好。
这里有一个相当完整的解释如何做到这一点。
您可以手动完成,也可以使用其中一个可提供相同信息的分析器,例如oprofile和RotateRight / Zoom。
顺便说一句,内联是有重要价值的,只有当内联的例程很小,并且自己不调用函数时,并且如果它们被调用的行足够有效,那么时间很重要。
至于调试和发布构建之间的数量级性能比,可能是由于许多事情,可能或可能不是内联。 您可以使用上面提到的stackshot方法来确定两种情况下发生的情况。 我发现,由于其他原因,调试版本可能会变慢,例如递归数据结构验证。
您可以使用功能更强大的分析器,例如英特尔的VTune,它可以为您提供组装线级别的性能细节。
http://software.intel.com/en-us/intel-vtune/
它适用于Windows和Linux,但确实需要花钱...
使用CPU的高性能计时机制(例如,x86)开发一些宏 - 不依赖系统调用的例程,并将运行核心循环的单个线程绑定到特定CPU(设置亲和性)。 你需要实现下面的宏。
PROF_INIT //allocate any variables -- probably a const char
PROF_START("name") // start a timer
PROF_STOP() // end a timer and calculate the difference --
// which you write out using a async fd
我有这样的东西,我放在我感兴趣的每个函数中,我确保宏将定时调用放到调用树的上下文中 - 这可能是最准确的调用方式。
注意:
这种方法是由您的代码驱动的 - 并且不依赖于外部工具以任何方式窥探您的代码。 当涉及到小部分代码时,窥探,采样和中断驱动分析是不准确的。 此外,您想控制收集时间数据的位置和时间 - 就像您的代码中的特定构造一样,例如循环,递归调用链的开始或大容量内存分配。
- 编辑 -
你可能会对从这个答案到我的一个问题的链接感兴趣。
链接地址: http://www.djcxy.com/p/43845.html