我对以下空程序进行了性能分析,
#include <stdio.h>
int main() {
}
编译并运行 perf stat ./a.out 后,我得到以下输出(以及其他数据,如周期数、任务时钟等):
418,869 instructions # 0.87 insns per cycle
在同一 Sprite 的每次“性能”分析期间,指令数量都会发生变化。
我的实际需要是查找我编写的特定函数中的指令数。所以我将从新程序中的指令数中减去上述数字。(我可以计算在 gcc 中使用 -S 标记创建的 program.s 中的行数,但在查看 perf 行为后我感到困惑)
为什么指令条数不一致,准确的说是不一样?
更新 我遵循了 man page 中给出的示例在 C 中使用 perf_event_open()
最佳答案
为了测量函数执行的指令数,我建议使用 perf_event_open() 开始和停止事件计数在函数的进入和退出处,而不是在有和没有函数的情况下运行你的程序两次。
关于空程序执行的指令数的不确定性,您可能正在计算用户和内核领域的事件。我认为用户空间计数在两次运行之间应该保持不变,但是对于内核部分,执行该程序的幕后发生了很多事情,所以我猜不确定性来自内核代码中发生的事情。要仅计算用户空间指令,您可以使用:
perf stat -e instructions:u a.out
您能否提供更多有关差异的详细信息?
关于linux - perf stat 为每次运行提供不同数量的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26312127/