哪个更快找到if(n%2 == 0)或if(n&1 == 0)?

时间:2018-07-30 15:06:42

标签: math bit-manipulation modulo

以更快的速度找到偶数if(n%2 == 0)或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

2 个答案:

答案 0 :(得分:2)

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

事实上,我尝试了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选项生成了非常糟糕的代码。奇怪的是,与-O1相比,gcc在-O2上生成的代码严格更好。

答案 1 :(得分:1)

这看起来像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与BINARY_AND的一行,所以我不确定为什么会有如此大的时间差异。