【问题标题】:Can perf display raw sample counts?perf 可以显示原始样本数吗?
【发布时间】:2010-09-02 20:10:40
【问题描述】:

我希望perf 输出原始样本计数而不是百分比。这对于确定我是否加快了我正在尝试优化的功能很有用。

明确地说,我想做类似的事情

perf record ./a.out
perf report

看看 perf 对 a.out 中的每个函数采样了多少次。

Shark 可以在 Mac 上执行此操作,(我相信)Xperf 也可以。这在具有 perf 的 Linux 上可行吗?

【问题讨论】:

    标签: linux profiling


    【解决方案1】:

    性能报告(2.6.35.7 版)现在支持 -n 标志,它可以满足我的需求。

    【讨论】:

      【解决方案2】:

      您想看看您对函数的更改是否有所作为。 我想你也想得到任何帮助来找出你需要改变的功能。 这两个目标不一样。

      许多工具可以为您提供尽可能广泛的统计数据或计数器,就好像拥有更多统计数据将有助于实现任一目标一样。

      你能找到RotateRight/Zoom,或者任何可以让你在挂钟时间堆叠样本的工具,最好是在用户控制下吗?这样的工具将为您提供在任何例程或代码行上花费的时间和百分比,尤其是包含时间。

      包容性时间如此重要的原因在于,每行执行的代码都需要花费一定的时间,如果该行不存在,则不会花费这部分时间,而总时间将减少该分数。在那段时间里,无论是花费在一个大块还是数千个小块中,该代码行都在调用堆栈上,堆栈样本将在其中以等于其分数的速率发现它。这就是为什么堆栈采样在寻找值得优化的代码方面如此有效的原因,无论它是由叶指令还是调用树中的调用组成。

      就个人而言,this link 给出了我使用该方法的方式和原因,这并不花哨,但与我见过的任何方法或工具一样或更有效。 Here's a discussion.

      【讨论】:

      • perf annotate 会告诉你哪些指令很慢。但同样,它只显示百分比,而不是原始样本计数。
      • @Justin L.:无论是“慢”还是“快”,如果是函数调用指令,如果删除它会为您节省的时间是它在堆栈上的时间百分比。如果它不是函数调用指令,则删除后将保存的是它正在执行的时间百分比(即在堆栈顶部)。我不明白原始样本计数实际上告诉你什么。我确实了解原始随机时间堆栈样本告诉您的内容。它们会准确地告诉您优化的重点,以及您预计可以节省多少,而且您不需要太多。
      • @Justin L.:这就是 Zoom 做得非常好的地方。
      • 我想你可能误解了我的问题。如果我分析函数 A 并测量在 A 中花费的执行时间的百分比,然后我修改 A,创建函数 B,并测量在 B 中花费的执行时间的 b%,那么弄清楚 B 比 A 快多少并不容易,因为通过使 A 更快,我减少了总执行时间!但如果我知道我们在 A 中看到了 100 个样本,而在 B 中只看到了 80 个样本,那就很容易了。
      • 我对使用不同的工具来实现这一点不感兴趣。我知道其他工具可以做我想做的事——例如 Shark。问题只是 perf 是否可以做到这一点。听起来你的答案是否定的,这很好,而且可能是正确的。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2011-12-06
      • 2012-04-06
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多