剖析特定函数C ++
我已经看过gprof。 但不太明白如何实现以下目标:
我写了一个集群过程。 在每次迭代中,4个函数被重复调用。 大约有100000次迭代要完成。 我想知道每个功能花了多少时间。
这些函数可能会调用其他子函数,并可能涉及像hashmaps,地图等数据结构。但我不在乎这些子函数。 我只想知道在所有迭代中花费在所有父函数上的总时间。 这将帮助我更好地优化我的程序。
gprof的问题在于,它分析了每个函数。 所以即使是stl数据结构的功能也要考虑在内。
目前我正在使用clock_gettime。 对于每个函数,我输出每次迭代所需的时间。 然后我操纵这个输出文件。 为此,我必须键入很多分析代码。 分析代码使我的代码看起来非常复杂,我想避免它。 这是如何在行业中完成的?
有没有更简单的方法来做到这一点?
如果您有其他更清洁的方式,请告诉我
如果我理解正确,那么您对在您感兴趣的四个目标函数中花费了多少时间感兴趣,但不感兴趣那些函数调用的任何子函数。
这些信息在gprof的“自我秒”下的“平面”配置文件中提供。 或者,如果您正在查看调用图,则此时间位于“自我”列中。
我会看看遥测。 它主要针对想要比较每帧数据的游戏开发者,但它似乎非常适合您的需求。
你需要这4个函数的自我时间,所以你可以专门优化它们。
gprof
会告诉你,占总时间的百分比。 假设它是10%。 如果是这样,即使您可以将其优化为0%,您也可以获得100/90 = 1.11的加速因子或11%的加速比。 如果花了100秒,那太慢了,机会也是90秒也太慢了。
然而,这些功能所包含的包含(自我加上被调用者)时间可能是一个非常大的百分比,80%,选择一个数字。 如果是这样,您可以通过减少对这些被调用者的调用来优化它。 或者,你可以发现被调用者花费很大的代价去做一些你并不严格需要做的事情,比如为了一般性而测试他们的参数,在这种情况下你可以用特殊的例程替换它们。
事实上,严格来说,没有自我时间这样的事情。 即使找到程序计数器的最简单的指令实际上也是对微码子程序的调用。
以下是对这些问题的讨论和建设性建议。
链接地址: http://www.djcxy.com/p/7623.html