5-t*_*o-9 2 linux instructions perf
我想在我的代码中为每个函数调用动态指令计数,以便我可以将该计数器视为:
name of function | instructions
foo() | 3533
bar() | 1234
Run Code Online (Sandbox Code Playgroud)
以下是子问题:
perf
吗?perf
我应该使用什么样的标志来获取(至少)这些信息?您是否尝试获取静态指令计数,即每个函数在最终二进制文件中编译的指令数量?
如果是这种情况,这是二进制文件的静态属性,因此您不需要perf
(在运行时工作)来确定这一点 - 您只需用二进制文件反汇编objdump -d a.out
并计算指令数即可.如果要自动化它,请使用您选择的脚本语言awk
或其他任何内容(可能正在寻找下一个空白行).
举个例子,你可以采取以下方式:
int foo(int a, int b) {
return a << (10 + b);
}
Run Code Online (Sandbox Code Playgroud)
而objdump
输出将会是这样的(你可以看到确切的内容依赖于编译器和标志):
foo(int, int): # @foo(int, int)
lea ecx, [rsi + 10]
shl edi, cl
mov eax, edi
ret
Run Code Online (Sandbox Code Playgroud)
所以共有4条指令,包括ret
.
但是,您可能正在讨论动态指令计数 - 即在应用程序的特定运行中每个方法内执行的指令总数?在这种情况下,您可以很快得到一个近似答案,perf record -e instructions
然后perf report -n --stdio
列出函数及其样本计数.您可以通过乘以总样本与报告顶部显示的"事件计数"的比率,将相同的计数扩展到指令计数.
典型报告可能如下所示:
#
# Total Lost Samples: 0
#
# Samples: 51K of event 'instructions:p'
# Event count (approx.): 27502612549
#
# Overhead Samples Command Shared Object Symbol
# ........ ............ ........... ................... .................................................................................................
#
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
Run Code Online (Sandbox Code Playgroud)
在合理的假设下,您可以预期这些统计结果与真实结果相当接近.但是,如果您需要精确计数,则可以使用解决方案,例如使用英特尔处理器跟踪,它可以重建流程的整个执行历史记录.彼得的答案也提到了这些.
归档时间: |
|
查看次数: |
415 次 |
最近记录: |