我正在使用perf来了解我的程序的每个函数对总执行时间的开销。为此,我使用cpu-cycles事件:
perf record -e cpu-cycles -c 10000 <binary-with-arguments>
当我查看输出时,我看到与每个功能相关的一些百分比。但对我来说没有意义的是这样的情况:函数A在函数B中被调用而在其他地方没有。但是我获得的函数A的开销百分比高于B.如果B调用A,则意味着B应该包含A的开销。或者我在这里遗漏了什么?
答案 0 :(得分:5)
您使用的perf命令仅对您的程序进行采样,而不记录调用堆栈的任何信息。使用perf report
,您可以获得与您的调用关系无关的样本数量。
使用--call-graph
时,您可以使用perf report
选项获取树:
perf record -e cpu-cycles --call-graph dwarf -c 10000 <binary-with-arguments>
答案 1 :(得分:1)
Perf适用于CPU的模型特定寄存器,用于测量周期或分支未命中等。 一个名为PMU(绩效测量单位)的特殊部分正在计算各种事件。
因此,如果仅测量程序的一些功能,实际上没有开销,因为CPU的PMU独立于实际计算而工作。
如果超过PMU的Registercount,测量将循环显示要测量的功能。 Perf用[XX%]注释这个。