【问题标题】:Performance of OR EQUAL vs EQUAL assignment in a for-loop在 for 循环中 OR EQUAL 与 EQUAL 分配的性能
【发布时间】:2019-04-27 09:32:37
【问题描述】:

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

考虑一个 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 运算符相比,它不会多次存储真值。但是在写这篇文章时,我意识到 OR EQUAL 无论如何都会添加一个额外的操作来评估/读取变量的当前值。那么哪个会更快或操作更少?

【问题讨论】:

  • 取决于分配后的...。一旦 b 设置为 true ,您也可以中断循环 is ... 是无操作的。剩下的就是现在很少相关的边际优化。
  • 是的,一旦 b 为真,我就想过打破,但这就是我添加 ... 的原因。 ... 是需要做的事情,换句话说,我们不能在循环结束之前中断。我知道这真的不相关,只是我脑海中突然出现的一个问题,想知道是否有人可以提供关于 SO 的答案。

标签: performance variable-assignment assignment-operator


【解决方案1】:

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

如果编译器会按字面翻译,|= 操作将不涉及评估变量以了解是否应该对值进行 OR'ing。编译器将简单地发出一个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 相比。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 2015-08-28
    • 2012-11-21
    • 2017-03-01
    • 2011-04-28
    • 2012-11-18
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多