我看过gprof。但是不太明白如何实现以下目标:
我写了一个聚类程序。在每次迭代中,重复调用4个函数。大约有100000次迭代要完成。我想知道每个功能花了多少时间。
这些函数可能会调用其他子函数,可能涉及数据结构,如hashmaps,maps等。但我不关心这些子函数。我只是想知道在所有迭代中所有这些父函数花费了多少总时间。这将有助于我更好地优化我的计划。
gprof的问题在于,它分析每个函数。因此,即使是stl数据结构的功能也被考虑在内。
目前我正在使用clock_gettime。对于每个函数,我输出每次迭代所花费的时间。然后我操纵这个输出文件。为此,我必须输入大量的分析代码。分析代码使我的代码看起来非常复杂,我想避免它。这是如何在行业中完成的?
有更简单的方法吗?
如果您有其他更干净的方式,请告诉我
答案 0 :(得分:4)
如果我理解正确,你会对你感兴趣的四个目标函数花费多少时间感兴趣,而不是那些函数调用的任何子函数。
此信息在“自我秒”下的gprof“平面”配置文件中提供。或者,如果您正在查看调用图,则此时间位于“自我”列中。
答案 1 :(得分:1)
我会看一下telemetry。它主要针对想要比较每帧数据的游戏开发者,但它似乎非常符合您的要求。
答案 2 :(得分:1)
您需要这4个功能的自我时间,因此您可以专门对它们进行优化。
gprof
会告诉您,占总时间的百分比。
假设它是10%。如果是这样,即使您能够将其优化为0%,您也可以获得100/90 = 1.11的加速因子或11%的加速比。
如果耗时100秒,那太慢了,很可能90秒也太慢了。
然而,这些功能所花费的包含(自加加速度)时间可能是一个更大的%,80%,以选择一个数字。如果是这样,您可以通过减少对这些被调用者的调用来进一步优化它。或者,您可能会发现被调用者花费大量的时间做一些您并不需要完成的事情,例如为了一般性而测试他们的参数,在这种情况下,您可以用ad-hoc例程替换它们。
事实上,严格来说,没有自我时间这样的事情。即使是找到程序计数器的最简单的指令实际上也是对微代码子程序的调用。
Here is some discussion of the issues and a constructive recommendation.