2012-08-24 51 views
3

我已经看过gprof。但不太明白如何实现以下功能:分析特定功能C++

我写了一个集群过程。在每次迭代中,4个函数被重复调用。大约有100000次迭代要完成。我想知道每个功能花了多少时间。
这些函数可能会调用其他子函数,并可能涉及像hashmaps,地图等数据结构。但我不在乎这些子函数。我只想知道在所有迭代中花费在所有父函数上的总时间。这将帮助我更好地优化我的程序。

gprof的问题是,它分析了每个函数。所以即使是stl数据结构的功能也要考虑在内。

目前我正在使用clock_gettime。对于每个函数,我输出每次迭代所需的时间。然后我操纵这个输出文件。为此,我必须键入很多分析代码。分析代码使我的代码看起来非常复杂,我想避免它。这是如何在行业中完成的?

有没有更简单的方法来做到这一点?

如果您有任何其他清洁的方式,请让我知道

+0

通过使用英特尔VTune放大器 – BSen

回答

4

如果我理解正确,那么您对在感兴趣的四个目标函数中花费了多少时间感兴趣,但不感兴趣那些函数调用的任何子函数。

此信息由gprof的“平面”配置文件在“自我秒”下提供。或者,如果您正在查看调用图,则此时间位于“自我”列中。

1

我看看telemetry。它主要针对想要比较每帧数据的游戏开发者,但它似乎非常适合您的需求。

1

你想要这4个功能的自我时间,所以你可以专门优化它们。

gprof会告诉你,占总时间的百分比。 假设它是10%。如果是这样,即使您可以将其优化为0%,您也可以获得100/90 = 1.11的加速因子或11%的加速比。 如果花了100秒,那太慢了,机会也是90秒也太慢了。

但是,包括(自我加上被调用者)这些函数所花费的时间可能是一个更大的百分比,80%,选择一个数字。如果是这样,您可以通过减少对这些被调用者的调用来优化它。或者,你可以发现被调用者花费很大的代价去做一些你并不严格需要做的事情,比如为了一般性而测试他们的参数,在这种情况下你可以用特殊的例程替换它们。

事实上,严格地说,没有自我时间这样的事情。即使找到程序计数器的最简单的指令实际上也是对微码子程序的调用。

Here is some discussion of the issues and a constructive recommendation.