1

哪种结构更可取,为什么?

A:

if(i < 1023)
   ++i;
else
   i = 0;

乙:

++i;
if(i == 1024)
  i = 0;

C:

i = (i + 1) & 1023;

或其他?

我喜欢替代 C,因为它很小并且没有分支(因此,没有管道中断),但它执行的 AND 操作仅在每 1024 次中的 1 次中有用......

4

2 回答 2

2

我每次都会选择选项C。它可能不太明显,但是对于任何有编码经验的人来说,这个习语都足够清楚,它可以为你节省那个条件分支。在现代(即过去 10 年中任何容易发生的事情)超标量处理器上,瓶颈是内存和/或分支预测;像二进制 AND 这样的算术运算在一个很好的近似值上是免费的。

于 2013-01-30T07:25:00.370 回答
0

在 100k for 循环中运行它们会给我以下结果:
A:10.439 秒
B:
9.845 秒 C:9.482 秒
就我个人而言,我会使用 A,因为我习惯了这种表示法并且它保持清晰。如果速度是一个问题,C 似乎是这三个中最好的。

于 2013-01-30T05:20:26.547 回答