我推荐打印一份the gprof paper并仔细阅读。
根据论文,这里是gprof如何度量时间。它对PC进行采样,并计算每个程序中有多少样品落地。乘以样本之间的时间,即每个例程的总数自身时间。
它还通过呼叫地点在表格中记录了例程A调用例程B的次数,假设例行程序B由-pg选项检测。通过总结这些,它可以知道例程B被调用了多少次。
从呼叫树的底部开始(总时间=自我时间),它假定每个例程的每次呼叫的平均时间是其总时间除以呼叫数量。
然后它回到这些例程的每个调用者。每个例程的时间是其平均自我时间加上每个下级例程的平均调用次数乘以下级例程的平均时间。
即使递归(调用图中的循环)不存在,您也可以看到它是如何充满错误的可能性的,例如有关平均次数和平均调用次数的假设以及有关子程序的测试假设,作者指出。如果是递归,他们基本上会说“忘记它”。
所有这些技术,即使它没有问题,都会引起问题 - 它的目的是什么?通常,目的是“找到瓶颈”。根据该文件,它可以帮助人们评估替代实施。这没有找到瓶颈。他们确实建议查看似乎被称为很多次的例程,或者平均时间较长的例程。当然,平均累计时间较少的例程应该被忽略,但这并不能将问题局限在很大程度上。而且,它完全忽略I/O,就好像所有完成的I/O无疑是必需的。
因此,要尝试回答您的问题,请尝试Zoom,并且不要期望消除测量中的统计噪音。
gprof是一种古老的工具,简单而坚固,但它在开始时遇到的问题仍然存在,并且在干涉的几十年中出现了更好的工具。 Here's a list of the issues.