关于L1缓存miss rate计算逻辑的误解与perf实测矛盾的疑问
关于L1缓存miss率的误解纠正
你的核心错误是误解了缓存命中/未命中的计数逻辑,以及perf工具的统计规则,具体拆解如下:
1. 缓存请求的计数逻辑并非“miss后必加hit”
当CPU发起一次加载请求时,流程是这样的:
- 若L1缓存命中:直接返回数据,本次请求计为1次hit,流程结束,没有“再次检查L1”的步骤。
- 若L1缓存未命中:本次请求计为1次miss,随后CPU会从L2/L3/内存获取数据,并将数据加载到L1缓存(符合缓存替换策略的前提下)。但这次加载请求本身的计数就是miss,不会因为数据被写入L1就额外生成一次hit——只有后续再次访问该数据时,才会产生hit。
你假设的“miss后必有hit”只在“同一份数据被至少访问两次”的场景下成立,但实际程序中很多数据只会被访问一次,这时候就只有miss,没有对应的hit。
2. perf工具的统计规则
perf中计算L1缓存miss率的两个关键事件是:
L1-dcache-loads:CPU发起的所有L1数据加载请求总数L1-dcache-load-misses:其中未命中L1缓存的请求数
miss率的计算公式就是:
miss_rate = L1-dcache-load-misses / L1-dcache-loads
完全是单次请求的结果统计,不存在“miss和hit绑定”的逻辑。
3. 为什么miss率会超过50%?
举两个典型场景:
- 遍历超大规模数组:当数组容量远大于L1缓存时,每次访问的缓存行都是新的,几乎所有加载请求都会L1 miss,miss率接近100%。
- 随机内存访问:程序随机访问内存地址,大部分目标数据不在L1缓存中,此时miss率会远高于50%。
内容的提问来源于stack exchange,提问作者rrpp1045
相关产品推荐
相关产品推荐

