在性能真正重要的重复算术运算中,按位运算符会对性能产生正面或负面影响吗?我尝试过谷歌,但无法得到明确的答案。
例如,我应该使用它:
int s = 15 << 4;
或者这个:
int s = 15 * 16;
提高我的应用程序的性能。
operator precedence也与效果相关吗?
答案 0 :(得分:5)
即使这些操作不是compile-time constant expressions(例如n << 4
),虚拟机也会在JIT编译期间选择更快的实现,因此您可以用任何一种最易读的方式编写。表现将是相同的。
这里是HotSpot JVM C2 JIT编译器的the C++ code,它将乘法替换为左移的幂数为2。稍微低一点,你可以找到一些常量的更多优化(比如用n * 12
替换(n << 3) + (n << 2)
)。
答案 1 :(得分:4)
在这种情况下,你可以使用。
两者都是编译时可评估的常量表达式,因此编译器将执行该操作。所以运行时根本不会受到影响。
如果你设计了一个只能在运行时评估的例子,那么就更难说了,但如果我是你,我会信任编译器。始终使用适当的操作符来完成任务,这样就不会出现错误。您可以随时分析性能。
答案 2 :(得分:2)
此代码
public class A {
public static void main(String[] args) {
int a = 15 << 4;
int b = 15 * 16;
}
}
编译为
public static void main(java.lang.String[]);
Code:
0: sipush 240
3: istore_1
4: sipush 240
7: istore_2
8: return