以下哪种技术是将整数除以2的最佳选择,为什么?
技巧1:
x = x >> 1;
Run Code Online (Sandbox Code Playgroud)
技术2:
x = x / 2;
Run Code Online (Sandbox Code Playgroud)
这x是一个整数.
如果您恰好使用2的幂,则左右移位显然比大多数甚至所有CPU上的乘法和除法运算更快.但是,它可能会降低某些读取器和某些算法的代码清晰度.位移对于性能是否真的是必要的,或者我可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET行为感兴趣,但欢迎深入了解其他语言实现.
Eclipse编译器会自动将乘法乘以2的幂转换为位移,还是应该手动执行?谢谢您的帮助.
我一直在读,不需要进行移位,因为编译器的优化会将乘法转换为移位。例如我应该在Java中位移除以2吗?和移位比Java中的乘法和除法快吗?。净?
我不是在这里询问性能差异,我可以自己测试一下。但是我认为很好奇的是,有几个人提到它将被“编译为同一件事”。这似乎是不正确的。我已经写了一小段代码。
private static void multi()
{
int a = 3;
int b = a * 2;
System.out.println(b);
}
private static void shift()
{
int a = 3;
int b = a << 1L;
System.out.println(b);
}
Run Code Online (Sandbox Code Playgroud)
给出相同的结果,并将其打印出来。
当我查看生成的Java字节码时,将显示以下内容。
private static void multi();
Code:
0: iconst_3
1: istore_0
2: iload_0
3: iconst_2
4: imul
5: istore_1
6: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
9: iload_1
10: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
13: return
private static void shift();
Code:
0: …Run Code Online (Sandbox Code Playgroud) java ×3
optimization ×3
.net ×1
bytecode ×1
c ×1
c# ×1
c++ ×1
compilation ×1
division ×1
eclipse ×1