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,所以我不确定为什么会有这么大的时间差异.
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,所以我不确定为什么会有这么大的时间差异.