You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解perf中的百分比?如何让perf report展示函数总耗时占比?

关于perf性能分析的问题与解答

测试用C++程序

#include <cmath>

void foo()
{
    double x = 42.0;
    for ( unsigned long i = 0; i < 10000000; ++i )
        x = std::sin( x );
}

int main()
{
    foo();

    return 0;
}

执行的命令

g++ main.cpp
perf record ./a.out
perf report

perf报告结果

Samples: 518  of event 'cycles', Event count (approx.): 410229343
Overhead  Command  Shared Object      Symbol
  84,28%  a.out    libm.so.6          [.] __subtf3
  12,59%  a.out    a.out              [.] foo
   2,47%  a.out    a.out              [.] _init
   0,47%  a.out    [kernel.kallsyms]  [k] may_open
   0,17%  a.out    [kernel.kallsyms]  [k] memcg_slab_post_alloc_hook
   0,01%  perf-ex  [kernel.kallsyms]  [k] mutex_unlock
   0,01%  a.out    [kernel.kallsyms]  [k] __intel_pmu_enable_all.constprop.0
   0,00%  perf-ex  [kernel.kallsyms]  [k] native_write_msr
   0,00%  a.out    [kernel.kallsyms]  [k] native_write_msr

问题解答

1. 如何理解报告中foo函数的12.59%占比?

这个12.59%是foo函数的自耗时占比,仅统计foo自身代码执行消耗的CPU周期——也就是循环变量初始化、循环条件判断、变量x的赋值这些操作的耗时,不包含它调用的std::sin(以及std::sin内部调用的__subtf3)的耗时。foo里的核心逻辑是循环调用std::sin,这部分耗时被单独统计到了libm库的__subtf3函数上,所以foo自身的占比仅剩下12%左右。

2. 如何让perf report展示函数的总耗时占比,例如显示foo占99%、__subtf3占90%?

要展示包含子调用的总耗时(Inclusive Overhead),可以给perf report添加以下选项:

  • 使用perf report -g:会显示函数调用栈,在栈结构中能看到每个函数自身加上所有子调用的总耗时占比;
  • 使用perf report --hierarchy:会以层级化的结构展示函数的总耗时,此时foo的总占比会接近99%(因为它的耗时几乎全部来自调用__subtf3),而__subtf3的总占比就是它的自耗时占比84.28%(因为它没有更多向下的子调用)。

内容的提问来源于stack exchange,提问作者Igor Mironchik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:21:31