性能如何工作?

How does perf work?

我正在使用 perf 来了解程序的每个函数对总执行时间的开销。为此,我使用 cpu-cycles 事件:

perf record -e cpu-cycles -c 10000 <binary-with-arguments>

当我查看输出时,我看到了一些与每个函数相关的百分比。但是对我来说没有意义的是这样的情况:函数 A 在函数 B 中被调用,而不是在其他任何地方。但是我得到的函数 A 的开销百分比高于 B。如果 B 调用 A,则意味着 B 应该包含 A 的开销。或者我在这里遗漏了什么?

您使用的 perf 命令仅对您的程序进行采样,而没有记录调用堆栈的任何信息。使用 perf report 你可以得到独立于函数调用关系的样本数量。

你可以在使用perf report时使用--call-graph选项得到一棵树:

perf record -e cpu-cycles --call-graph dwarf -c 10000 <binary-with-arguments>

Perf 在您的 CPU 的模型特定寄存器上工作,以进行周期或分支未命中等测量。 一个叫做 PMU(Performance Measurement Unit) 的特殊部分正在统计各种事件。

因此,如果您只测量程序的一些功能,实际上没有开销,因为 CPU 的 PMU 独立于实际计算工作。

如果您超过了 PMU 的 Registercount,测量将循环通过要测量的特征。 Perf 用 [XX %].

对此进行注释