如何使用perf为代码标注缓存缺失率(而非仅缓存命中/缺失数)?
用perf annotate查看代码行级缓存缺失率的方法
要在perf annotate里显示缓存缺失率,核心是同时采集缓存命中和缺失的配对事件,然后让perf计算比率,具体步骤如下:
1. 正确采集配对的缓存事件
首先用perf record同时记录缓存加载(命中+缺失的总次数)和缓存缺失的事件,比如针对L1数据缓存:
perf record -e L1-dcache-loads,L1-dcache-load-misses -g ./你的程序
如果要分析指令缓存,换成:
perf record -e L1-icache-loads,L1-icache-load-misses -g ./你的程序
要是想看所有缓存层级的整体情况,用通用缓存事件:
perf record -e cache-references,cache-misses -g ./你的程序
参数说明:
-g:记录调用栈,方便定位到具体函数和代码行- 可加
-F 99设置采样频率,避免采样过度影响程序运行
2. 用perf annotate查看缺失率
命令行直接输出比率
运行以下命令,直接在代码行旁显示缺失率(缺失数/总加载数):
perf annotate --ratio
交互式界面切换显示模式
如果用交互式的perf annotate:
- 运行
perf annotate进入界面 - 按
r键切换显示模式,此时每个代码行的计数后面会自动显示缺失率百分比 - 按
c键可以按缓存事件的计数排序,快速定位缺失率最高的代码块
额外提示
- 确保perf版本在5.0以上,旧版本可能需要手动计算,但交互式的
r键切换功能大部分版本都支持 - 可以先用
perf report --ratio查看函数级的缺失率,找到热点函数后,再进入该函数的annotate视图看代码行级细节 - 必须配对正确的事件:比如
L1-dcache-load-misses必须和L1-dcache-loads搭配,不能混用不同类型的缓存事件,否则计算出的比率没有意义
内容的提问来源于stack exchange,提问作者mauld
相关产品推荐
相关产品推荐

