【问题标题】:test bit by right shift same speed as left shift?右移测试位与左移速度相同吗?
【发布时间】:2014-01-29 13:13:22
【问题描述】:

做的速度一样吗

#define CHECK_BIT_BOOL(var,pos) ((var>>(pos)) & 1)

作为

#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))

目标是不使用 BOOL 宏,例如:

#define BOOL(x) (!(!(x)))

BOOL(CHECK_BIT(foo, 3));

这样做更好: CHECK_BIT_BOOL(foo,3);

general test bit question

【问题讨论】:

  • 我检查了 ICC、Clang 和 GCC,在我测试的所有情况下(这不是全部),它实际上没有区别,例如,发出的代码是完全相等。即使pos 是一个常数。
  • 好的,我的用例是 gcc 4.7 和 cpu=cortex-A8 -O3
  • C 有时非常接近硬件。在这种情况下,您的问题基本上归结为“在已知世界的每个 CPU 上,逻辑左移指令占用的 CPU 周期是否与逻辑右移以及布尔 AND 指令一样多?”这样的问题太笼统了,没有任何意义。一般来说,在没有考虑特定系统的情况下谈论优化是没有任何意义的。
  • @DavidBonnin 对于 ARM 来说,这两种方式都是一样的,至少在我测试的情况下以及使用 g++4.6 和 -O2 时是这样。您也可以随时自行检查,看看您的具体情况是否仍然如此。

标签: c++ c boolean bit-manipulation


【解决方案1】:

当前的 C 编译器在将典型代码翻译成最好的机器语言方面非常聪明。大多数情况下,试图智取编译器会使编译器产生愚蠢的代码。

现代 CPU 一次能够执行多个操作,无论这用完多少时间,都可能会被其他操作所掩盖,并且没有任何区别。而且 CPU 比内存快得多,大多数程序在内存访问方面比计算更慢。

您的时间编程比通过此类微优化获得的运行时收益更有价值,除非代码每天在数百万台机器上运行数千次。专注于简单、干净、明显正确和可理解的代码。下周阅读时,您将不胜感激。

【讨论】:

    【解决方案2】:

    如果pos 是一个常数,那么CHECK_BIT 可能会稍微快一些,因为不需要在运行时进行转换。否则,两者很可能是相同的。但正如您所指出的,如果您需要将结果限制为 0 或 1,则需要在 CHECK_BIT 之后做更多的工作。

    这当然取决于您的目标平台,如果您的性能要求足够严格,足以担心单处理器指令的成本,您就必须在真实系统上分析和测量实际性能。

    【讨论】:

      【解决方案3】:

      如果 var 和 pos 不在内存中但已经在寄存器中,则 CHECK_BIT_BOOL 和 CHECK_BIT 非常快。即使它在内存中 - 你也无法更快地获得它(如果 var 是 1 字节,你可以创建 256*8 结果数组并通过返回 results[var + 256*8] 立即返回结果,但它会比做 >> 和 &)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 2013-10-31
        • 2014-12-30
        相关资源
        最近更新 更多