此问题主要针对编译的编程语言。纯粹出于好奇,因为我相信使用两个运算符之一的性能提升将非常小。
考虑一个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无论如何都会添加一个额外的操作,以便评估/读取变量的当前值。那么哪个更快或更不需要执行什么操作?
答案 0 :(得分:1)
最新的compilers优化为最佳运行时间,这意味着生成的汇编器或机器代码可能是相同的。您可能会不感兴趣地看一下为两个版本生成的程序集。我敢打赌他们是完全一样的。
如果编译器将进行字面翻译,则|=
操作将不涉及评估变量以知道是否应对值进行“或”运算。编译器将只发出or
指令,因为与首先检查变量(它可能最终清除指令流水线)相比,该指令等效且速度更快。
如果不进行优化,则生成的程序集可能是(ax
是处理器寄存器):
or ax,1 ; for b|=true
mov ax,1 ; for b=true
我怀疑当前的处理器是否会完全影响执行速度。即使会有所作为,我们也在谈论这样的边际优化:从memory to cache到processor/registers的加载时间,或者CPU上的thread switches/process switches,或者branch misprediction在流水线微处理器等中。