You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分支预测错误与缓存失效开销对比:两段代码的统计速度差异分析

性能对比分析(基于现代Intel x86架构)

先给出核心基准开销参考:

  • L1缓存命中读写:13ns(约310个时钟周期)
  • 分支预测错误惩罚:1020ns(约1530个时钟周期)
  • L1读未命中(命中L3/内存):40~200ns
  • 写未命中触发的RFO(缓存所有权请求,含跨核一致性同步):100~300ns,多线程冲突场景下开销更高

场景1:variable已存储在L1缓存中

备选1执行逻辑

首先读L1中的variable,和new_val比较后走分支:

  • 若分支预测正确:如果两值相等,直接跳过赋值,总开销仅为比较+分支的25ns;如果两值不等,多一次L1写操作,总开销36ns
  • 若分支预测错误:额外增加10~20ns的流水线刷新惩罚

备选2执行逻辑

直接执行L1写操作,无分支无比较,固定开销1~3ns

结论

这个场景下你的猜测不成立,孰快孰慢取决于分支预测准确率和两值相等的概率:

  • 如果两值相等的概率超过30%,且分支预测准确率高于80%,备选1更快
  • 如果分支预测错误率超过50%,或两值几乎永远不等,备选2更快,因为完全避免了分支惩罚

场景2:variable不在缓存中

备选1执行逻辑

首先触发读缓存未命中,CPU从下一级存储拉取缓存行到L1(状态为共享态),之后再执行比较和分支:

  • 若两值相等:不需要执行写操作,也不会修改缓存行状态,除了读未命中的40200ns开销,不会产生额外的缓存一致性开销,就算分支预测全错,总开销也仅为50220ns
  • 若两值不等:再触发L1写命中,把缓存行改为修改态,额外增加1~3ns开销

备选2执行逻辑

直接触发写未命中,CPU首先发送RFO请求拿到缓存行所有权(需要同步所有其他核的对应缓存行,全部失效后才能拉取到本地),之后再执行写操作,固定开销为100~300ns,多线程场景下如果有其他核正在访问该变量,开销还会翻数倍。

结论

这个场景下你的猜测完全成立:哪怕分支预测错误率为100%,备选1的平均开销也远低于备选2,核心原因是读未命中+分支错误的总开销,远低于写未命中带来的RFO+缓存一致性同步开销,且如果两值相等的概率越高,备选1的优势越大。


补充说明

如果编译器将备选1的分支优化为cmov(条件传送指令),则完全消除了分支预测错误的惩罚,这种情况下无论哪种场景,备选1的性能都不会弱于备选2。

内容的提问来源于stack exchange,提问作者ABu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:06:07