我对下面的空程序进行了性能分析,
#include <stdio.h> int main() { }
编译并运行perf stat ./a.out后,我得到了如下的输出(连同其他数据,如周期数,任务时钟等):
418,869 instructions # 0.87 insns per cycle
在同一个精灵的每个“性能”分析期间,指令的数量都会改变。
我的实际需要是在我写的特定函数中find指令的数量。 所以我会从新程序中的指令数量中减去上面的数字(我可以用在gcc中使用-S标签创build的program.s中的行数,但是在查看perf行为后我感到困惑)
为什么说明的数量不一致,确切不一样?
更新我遵循手册页中给出的示例在C中使用perf_event_open()
为了测量你的函数执行的指令的数量,我建议在函数的入口和出口处使用perf_event_open()来启动和停止事件计数,而不是在使用和不使用函数的情况下运行两次程序。
关于你的空程序所执行的指令数量的非确定性,你可能正在计算用户和内核用户的事件。 我认为在两次运行之间用户的地盘数应该保持不变,但是对于内核部分来说,执行这个程序背后有很多事情发生,所以我猜测非确定性来自内核代码中发生的事情。 要仅计算用户空间指令,您可以使用:
perf stat -e instructions:u a.out
你能否提供更多关于差异的细节?