如何理解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
相关产品推荐
相关产品推荐

