Perf能够显示原始样本计数吗?

5
我希望perf输出原始样本计数而不是百分比。这对于确定我正在尝试优化的函数是否加速很有用。
明确一下,我想做的是像这样的事情:
perf record ./a.out
perf report

并查看perf在a.out中对每个函数采样的次数。

Shark可以在Mac上完成此操作,Xperf(我相信)也可以。在Linux上使用perf是否可行?

2个回答

5

perf report(版本2.6.35.7)现在支持-n标志,这正是我想要的。


1

你想知道对函数所做的更改是否有所不同。 我想你也想知道需要更改哪个函数,以及如何获得帮助。 这两个目标并不相同。

许多工具会给你尽可能广泛的统计数据或计数器,好像拥有更多的统计数据会有助于实现任一目标。

你能否获取RotateRight/Zoom或任何可以在用户控制下提供堆栈样本的工具?这样的工具将为您提供任何例程或代码行中花费的时间和百分比,特别是包含时间。

包含时间之所以如此重要,是因为执行的每一行代码都负责一定比例的时间,如果该行不存在,则不会花费该比例的时间,并且总体时间将减少该比例。在该时间的一小部分内,无论是在一个大块还是在成千上万个小块中度过,该代码行都在调用堆栈上,在那里堆栈采样将发现它,其速率等于其比例。这就是为什么堆栈采样在找到值得优化的代码方面如此有效,无论它是由叶指令还是调用树中的调用组成。

就个人而言,这个链接 阐述了我所使用的方法的原因和步骤,虽然不是很花哨,但比我见过的任何方法或工具都更加有效。这里有一个讨论。


perf annotate 会显示哪些指令运行缓慢。但是需要注意的是,它只显示百分比,而不是原始样本计数。 - Justin L.
@Justin L.:无论是“慢”还是“快”,如果它是一个函数调用指令,如果删除它,将节省在堆栈上的时间百分比。如果它不是函数调用指令,则如果删除它,它将节省被执行的时间百分比(即在堆栈顶部)。我不明白原始样本计数实际上告诉你什么。我确实知道原始随机时间堆栈样本告诉您什么。它们精确地告诉您应该集中优化的位置和大约可以期望节省多少,并且您不需要很多这些样本。 - Mike Dunlavey
@Justin L.:这正是Zoom的强项。 - Mike Dunlavey
我认为你可能误解了我的问题。如果我对函数A进行分析并测量执行时间中A占的比例为a%,然后我修改A,创建函数B,并测量执行时间中B占的比例为b%,那么要想知道B比A快多少就不容易了,因为通过让A变得更快,我已经减少了总执行时间!但是如果我知道在A中我们看到了100个样本,而在B中只看到了80个样本,那就很容易了。 - Justin L.
我不想使用其他工具来完成这个任务。我知道有其他工具可以做到我想要的,比如Shark。问题只是perf能否做到这一点。听起来你的答案是否定的,这很好,也很可能是正确的。 :) - Justin L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接