2011-02-17 58 views
2

我正在尝试使用gprof来分析C++函数,我对所花费的时间感兴趣。我做了不止一次的跑步,出于某种原因,我在结果上有很大的不同。我不知道是什么原因造成的,我假定采样率或者我在其他文章中看到I/O与它有关。那么有没有办法让它更精确,并以某种方式产生几乎恒定的结果?gprof输出中的不准确

我想如下:

  1. 提高采样率
  2. 清理执行任何
  3. 使用另一个探查前的缓存,但我希望它产生类似的格式格罗夫的结果函数时间%函数名称,我试过Valgrind,但它给了我一个大规模的文件。所以也许我用错误的命令生成文件。

等待你输入

问候

回答

4

我推荐打印一份the gprof paper并仔细阅读。

根据论文,这里是gprof如何度量时间。它对PC进行采样,并计算每个程序中有多少样品落地。乘以样本之间的时间,即每个例程的总数自身时间

它还通过呼叫地点在表格中记录了例程A调用例程B的次数,假设例行程序B由-pg选项检测。通过总结这些,它可以知道例程B被调用了多少次。

从呼叫树的底部开始(总时间=自我时间),它假定每个例程的每次呼叫的平均时间是其总时间除以呼叫数量。

然后它回到这些例程的每个调用者。每个例程的时间是其平均自我时间加上每个下级例程的平均调用次数乘以下级例程的平均时间。

即使递归(调用图中的循环)不存在,您也可以看到它是如何充满错​​误的可能性的,例如有关平均次数和平均调用次数的假设以及有关子程序的测试假设,作者指出。如果递归,他们基本上会说“忘记它”。

所有这些技术,即使它没有问题,都会引起问题 - 它的目的是什么?通常,目的是“找到瓶颈”。根据该文件,它可以帮助人们评估替代实施。这没有找到瓶颈。他们确实建议查看似乎被称为很多次的例程,或者平均时间较长的例程。当然,平均累计时间较少的例程应该被忽略,但这并不能将问题局限在很大程度上。而且,它完全忽略I/O,就好像所有完成的I/O无疑是必需的。

因此,要尝试回答您的问题,请尝试Zoom,并且不要期望消除测量中的统计噪音。

gprof是一种古老的工具,简单而坚固,但它在开始时遇到的问题仍然存在,并且在干涉的几十年中出现了更好的工具。 Here's a list of the issues.

2

gprof的不是很准确,特别是小功能,看http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC11

如果这是Linux的话,我建议不需要分析器待检测的代码,例如Zoom - 您可以获得免费的30天评估许可证,然后花费金钱。

所有采样轮廓仪都会受到统计误差的影响 - 如果误差太大,您需要更长时间采样和/或采样间隔更小。