Linux下如何按指令类型统计执行次数(可借助perf工具)
按指令类型统计执行次数的方法(Linux环境)
当然可以实现按指令类型统计执行次数,下面是几种实用的方案,涵盖perf原生工具链、硬件追踪工具以及现成脚本工具,最后附上版本对比的方法:
方法1:perf + 自定义脚本(通用方案,无需特殊硬件)
这个方案通过perf记录指令地址,结合程序的反汇编结果映射到指令类型,最终统计次数:
步骤1:生成程序的反汇编映射
编译程序时保留调试信息(加-g参数),然后导出.text段的反汇编结果:
objdump -d -j .text --no-show-raw-insn your_program > disasm.txt
该文件包含每个内存地址对应的汇编指令。
步骤2:编写统计脚本
创建awk脚本insn_count.awk,用来加载反汇编映射并处理perf输出:
BEGIN { # 加载地址到指令的映射 while ((getline < "disasm.txt") > 0) { if ($1 ~ /^[0-9a-f]+:$/) { addr = substr($1, 1, length($1)-1) # 提取指令类型(兼容movzx、cmovb这类多字符指令) insn = $2 insn_map[addr] = insn } } } # 处理perf输出的指令地址 $NF ~ /^0x/ { addr = substr($NF, 3) # 去掉0x前缀 if (addr in insn_map) { count[insn_map[addr]]++ } } END { # 按执行次数降序输出 PROCINFO["sorted_in"] = "@val_num_desc" for (insn in count) { printf "%6d %s\n", count[insn], insn } }
步骤3:执行统计
用perf记录用户空间指令事件,再用脚本统计:
# 记录用户空间指令事件 perf record -e instructions:u ./your_program # 提取指令地址并统计类型次数 perf script -F ip | awk -f insn_count.awk
方法2:Intel PT硬件追踪(精确统计,需Intel CPU支持)
如果你的CPU支持Intel Processor Trace(PT),可以用硬件级追踪精确统计所有执行的指令,效率更高:
步骤1:确认CPU支持PT
grep -i intel_pt /proc/cpuinfo
输出包含intel_pt则说明支持。
步骤2:记录并统计
# 记录PT追踪数据 perf record -e intel_pt//u ./your_program # 解析PT数据并统计指令类型 perf script --itrace=ie -F insn | awk '{if ($2 != "") count[$2]++}' | sort -nr -k1
--itrace=ie参数用来展开执行的指令流,最终输出按指令执行次数降序排列。
方法3:pmu-tools的insn_hist.py(现成工具)
pmu-tools套件中的insn_hist.py脚本可以直接完成指令类型统计,无需自行编写脚本:
# 安装pmu-tools(通过包管理器或本地编译) insn_hist.py ./your_program
该工具会自动结合perf和反汇编,输出类似你要求的统计格式。
两个版本程序的对比方法
分别对两个版本的程序生成统计结果,再用diff工具对比:
# 生成版本1的统计并排序 perf record -e instructions:u ./prog_v1 perf script -F ip | awk -f insn_count.awk | sort > prog_v1_stats.txt # 生成版本2的统计并排序 perf record -e instructions:u ./prog_v2 perf script -F ip | awk -f insn_count.awk | sort > prog_v2_stats.txt # 对比差异 diff -u prog_v1_stats.txt prog_v2_stats.txt
对比结果会清晰显示两个版本在指令类型执行次数上的差异,帮你定位性能变化的原因。
内容的提问来源于stack exchange,提问作者ajp
相关产品推荐
相关产品推荐

