我正在尝试使用gprof找出我的C++程序将时间花在哪里。这是我的两难境地:如果我使用与发布版本相同的优化设置进行编译,几乎所有内容都会内联,而gprof告诉我,我90%的时间都花在核心例程中,所有内容都是内联的。另一方面,如果我在禁用内联的情况下编译,程序的运行速度会慢一个数量级。
我想知道当我的程序在启用内联的情况下编译时,从我的核心例程调用的过程花费了多少时间。
我在一台英特尔四核机器上运行64位Ubuntu 9.04。我研究了google-perftools,但它在x86_64上似乎运行得不太好。在32位机器上运行不是一种选择。
对于如何在启用内联的情况下更有效地分析我的应用程序,有人有什么建议吗?
编辑:这里是对我的问题的一些澄清。如果一开始不清楚,我向您道歉。
我想找出我的应用程序中的时间都花在哪里了。分析我的优化构建导致gprof告诉我大约90%的时间都花在main上,所有东西都是内联的。在分析之前我就已经知道了!
我想知道的是内联函数花费了多少时间,最好不要禁用优化或在我的构建选项中使用内联。在禁用内联的情况下进行性能分析时,应用程序的速度要慢上一个数量级。这种执行时间上的差异是一个方便的问题,但我也不确定在禁用内联的情况下构建的程序的性能配置文件是否会与启用内联的程序的性能配置文件强烈对应。
简而言之:有没有一种方法可以在不禁用优化或内联的情况下获得有关C++程序的有用分析信息?
发布于 2010-01-19 01:33:56
我假设您想要做的是找出哪些代码行花费了您足够的成本来进行优化。这与定时函数有很大的不同。You can do better than .
Here's a fairly complete explanation of how to do it.
您可以手动完成此操作,也可以使用可以提供相同信息的分析器之一,例如和。
顺便说一句,只有当被内联的例程很小,并且不调用函数本身,并且它们被调用的行在足够长的时间内是活动的,才有重要的价值。
至于调试和发布版本之间的数量级性能比率,这可能是由于许多因素,可能是也可能不是内联。您可以使用上面提到的stackshot方法来确定在这两种情况下到底发生了什么。我发现,由于其他原因,调试构建可能会很慢,比如递归数据结构验证。
发布于 2010-01-19 01:27:01
使用CPU的高性能计时机制(例如,x86)开发几个宏,并将运行核心循环的单个线程绑定到特定的CPU (set the affinity)。您需要实现以下宏。
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
我在我感兴趣的每个函数中都放了这样的东西,我确保宏将计时调用放在调用树的上下文中--这可能是最准确的分析方法。
备注:
该方法由您的代码驱动,并且不依赖外部工具以任何方式窥探您的代码。当涉及到小段代码时,监听、采样和中断驱动的分析是不准确的。此外,您还希望控制何时何地收集计时数据--比如在代码中的特定构造,如循环、递归调用链的开始或大容量内存分配。
-编辑--
发布于 2010-01-19 01:34:44
您可以使用功能更强大的分析器,例如英特尔的VTune,它可以为您提供装配线级别的性能详细信息。
http://software.intel.com/en-us/intel-vtune/
它适用于Windows和Linux,但确实要花钱...
https://stackoverflow.com/questions/2087870
复制相似问题