您是否想获取静态指令计数,即在最终二进制文件中编译为每个函数的指令数量?如果是这种情况,这是二进制文件的静态属性,因此您不需要在运行时使用perf来确定它 - 您可以使用objdump -d a.out反汇编二进制文件并计算指令数。 如果要自动化,请使用所选的脚本语言或awk等(可能查找下一个空白行)。
例如,您可以采用以下内容:
int foo(int a, int b) {
return a << (10 + b);
}
而 objdump
的输出结果将会看起来像是 这样(你会看到确切的内容取决于编译器和标志):
foo(int, int): # @foo(int, int)
lea ecx, [rsi + 10]
shl edi, cl
mov eax, edi
ret
所以总共有4条指令,包括
ret
。
也许,你说的是
动态指令计数——即,在应用程序的特定运行中每个方法内执行的指令
总数?在这种情况下,您可以通过
perf record -e instructions
接着
perf report -n --stdio
快速获取近似答案,该命令应列出函数及其样本计数。您可以通过乘以总样本和报告顶部显示的“事件计数”的比率来将相同计数放大到指令计数。
一个典型的报告可能如下所示:
22.01% 4824 uarch-bench uarch-bench [.] add_calibration
1.92% 2480 uarch-bench uarch-bench [.] prefetcht2_bench2048_inner.top
1.92% 2477 uarch-bench uarch-bench [.] prefetcht1_bench2048_inner.top
1.91% 222 uarch-bench uarch-bench [.] prefetcht0_bench16_inner.top
1.91% 2021 uarch-bench uarch-bench [.] load_loop512_inner.top
在合理的假设下,您可以期望这些统计结果与真实结果相当接近。但是,如果您想要精确的计数,可以使用解决方案,例如使用英特尔的处理器跟踪功能,该功能可以重构进程的整个执行历史。这些也在Peter的答案中提到。