循环内直接赋值布尔变量与先检查再赋值哪种执行效率更高
结论
绝大多数场景下满足条件直接赋值的效率更高,额外加的冗余检查完全没有必要,甚至会拖累性能。
底层逻辑分析
- 单周期赋值成本极低:普通栈上布尔变量的赋值本身就是单CPU周期就能完成的操作,本身开销可以忽略不计。而额外增加的检查需要多执行「读取变量值→比较判断→分支跳转」至少三步操作,哪怕变量已经被优化到寄存器中,也比直接赋值多了指令开销,要是变量存在内存中,读内存的延迟更是远高于直接写的成本。
- 分支预测惩罚:如果循环中的触发条件出现时机随机,额外增加的分支有概率触发CPU分支预测失败,一次预测失败的开销就能抵得上几十次布尔赋值的成本,反而得不偿失。
编译器优化的影响
现代编译器(比如Rust使用的LLVM后端)的优化能力足够强,如果你开了正常的优化等级(比如--release),哪怕你写了带检查的版本:
if conditions && !ididit { ididit = true; }
LLVM大概率会识别到这个逻辑,直接把冗余检查删掉,最终生成的汇编和直接赋值的版本完全一致。但如果是开低优化等级、或者编译器没有识别到这个模式,带检查的版本就会凭空多出来无用指令。
唯一的例外场景
只有当这个变量是多线程共享的原子布尔(AtomicBool)、且你需要避免不必要的缓存行同步开销时,先检查再赋值才有收益。但你题目中的场景是普通的栈上mut bool,完全不存在这个问题。
内容的提问来源于stack exchange,提问作者In Hoc Signo
相关产品推荐
相关产品推荐

