for 循环中 OR EQUAL 与 EQUAL 赋值的性能

Performance of OR EQUAL vs EQUAL assignment in a for-loop

这个问题主要针对编译型编程语言。这纯粹是出于好奇,因为我相信使用这两个运算符之一的性能增益会非常小。

考虑一个 for 循环,当您满足特定条件时,您希望将 true 存储在布尔值中:

b = false
for i in 1..N:
   if someCondition(i):
      b = true
   moreThatNeedsToBeDone(i)
endfor

现在考虑用 OR EQUAL 代替相同的 for 循环

b = false
for i in 1..N:
   if someCondition(i):
      b |= true
   moreThatNeedsToBeDone(i)
 endfor

如果不止一次满足条件,理论上后者会更快吗?或者至少,它会做更少的操作吗?通常,OR EQUAL 会评估变量,如果它为真,则它不会执行任何操作,因此与 EQUAL 运算符相比没有额外的赋值,在 EQUAL 运算符中它会多次存储 true。但是写这篇文章时,我意识到 OR EQUAL 无论如何都会添加一个额外的操作,以便 evaluate/read 变量的当前值。那么哪个更快或操作更少?

最新的 compilers 优化到最好的 运行 时间,这意味着生成的汇编程序或机器代码可能是相同的。出于兴趣,您可以看一下为这两个版本生成的程序集。我敢打赌他们是一样的。

如果编译器按字面意思翻译,|= 操作将不涉及评估变量以了解是否应该对值进行或运算。编译器将简单地发出一条 or 指令,因为这与首先检查变量(最终可能会清除指令管道)等效且更快。

如果不进行优化,生成的程序集可能是(ax 是处理器寄存器):

or ax,1  ; for b|=true

mov ax,1 ; for b=true

我怀疑当前的处理器是否会影响执行速度。即使它会有所作为,我们谈论的是这种边际优化与流水线微处理器等中 memory to cache to processor/registers, or versus thread switches/process switches on CPU's, or versus branch misprediction 的加载时间。