【问题标题】:Cycling a variable around a power of two range围绕两个范围的幂循环变量
【发布时间】:2013-01-13 20:40:03
【问题描述】:

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

答:

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

乙:

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

C:

i = (i + 1) & 1023;

还是其他?

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

【问题讨论】:

  • 如果速度比可读性更重要,我会选择 C。 AND 并不比其他选择每次进行的比较更昂贵,更不用说分支的成本了。

标签: c++ c idioms


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 编译器优化参数有哪些?
    • @thang 没有,我想,我将 code::blocks 与 mingw 一起使用。未设置优化标志。
    • @Kevin:没有优化意味着你的测量毫无意义——你主要是在测量编译器指令选择器的弱点。
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 2021-07-16
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多