for循环中OR EQUAL与EQUAL分配的性能

时间:2018-11-25 15:59:14

标签: performance variable-assignment assignment-operator

此问题主要针对编译的编程语言。纯粹出于好奇,因为我相信使用两个运算符之一的性能提升将非常小。

考虑一个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对变量进行求值,如果它为true,则它不会执行任何操作,因此与EQUAL运算符相比,它会多次存储true,因此没有多余的赋值。但是写这篇文章时,我意识到OR EQUAL无论如何都会添加一个额外的操作,以便评估/读取变量的当前值。那么哪个更快或更不需要执行什么操作?

1 个答案:

答案 0 :(得分:1)

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

如果编译器将进行字面翻译,则|=操作将不涉及评估变量以知道是否应对值进行“或”运算。编译器将只发出or指令,因为与首先检查变量(它可能最终清除指令流水线)相比,该指令等效且速度更快。

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

or ax,1  ; for b|=true

mov ax,1 ; for b=true

我怀疑当前的处理器是否会完全影响执行速度。即使会有所作为,我们也在谈论这样的边际优化:从memory to cacheprocessor/registers的加载时间,或者CPU上的thread switches/process switches,或者branch misprediction在流水线微处理器等中。