if(n%2==0) 和 if(n&1==0) 哪个更快?

which is faster to find the even number if(n%2==0) or if(n&1==0)?

if(n%2==0) or if(n&1==0)哪个更快?

def isEven(n):
    if n%2 == 0:
        return True
    return False
OR

def isEven(n):
    if n&1 == 1:
        return False
    return True

我希望对那些表达式等效的语言进行合理的优化编译器,以等效地实现两个选项。

事实上,我尝试了 four different C++ compilers:gcc、clang、MSVC 和 icc,而 每个编译器实现的习语都与其他编译器不同 1,四分之三的编译器以相同的方式实现了这两个习语。

只有 icc 生成了不同的代码,在那种情况下 (n & 1) == 0 生成的代码比 n % 2 == 0 好得多 - 但你应该认为这是一个 icc 错误。

但是, 并非所有语言都实现优化编译器(提前或 JIT),特别是解释器可能会也可能不会类似地对此进行优化。如果您对特定语言或平台感兴趣,您可以考虑标记您的问题以反映这一点。


1 对于如此简单的代码,这实际上是令人惊讶和不寻常的。总体而言,clang 生成了最好的代码,其次是 MSVC,然后是 gcc。 icc 为 n % 2 选项生成了非常糟糕的代码。奇怪的是,gcc 在 -O1 处生成的代码比在 -O2.

处生成的代码要好得多

这看起来像 Python,所以我在 Python(3.6) 中尝试了它:

from timeit import timeit
a = timeit(stmt='for i in range(100): i%2')
b = timeit(stmt='for i in range(100): i&1')
print(a, b)

时间差异很大(谢谢,垃圾收集器!)但总的来说,这让我 i%2 大约 4.7 秒,i&1 大约 6.3 秒,我猜这可能不是答案你会期望。

我用dis检查了字节码,唯一的区别是一行运行 BINARY_MODULO vs BINARY_AND,所以我不确定为什么会有这么大的时间差异.