Java 运算符性能算术与按位
Java operators performance arithmetic vs bitwise
在性能非常重要的重复算术运算中,按位运算符对性能有正面影响还是负面影响?我尝试 Google 它但无法得到明确的答案。
例如我应该使用这个:
int s = 15 << 4;
或者这个:
int s = 15 * 16;
提高我的应用程序的性能。
operator precedence 也与绩效相关吗?
在这种情况下,您可以使用其中之一。
两者都是 compile-time 可计算常量表达式,因此 编译器 将执行该操作。所以运行时根本不会受到影响。
如果您设计了一个仅在运行时可评估的示例,那么就很难说了,但如果我是您,无论如何我都会相信编译器。始终为您的任务使用适当的运算符,以免出现错误。您始终可以分析性能。
即使这些操作不是compile-time constant expressions(例如n << 4
),虚拟机在JIT编译时也会select更快的执行,所以你可以写成任何一种这对你来说是最易读的。性能将相同。
这里是 HotSpot JVM C2 JIT 编译器的 the C++ code,它用左移将乘法替换为 power-of-two。在下面,您可能会发现一些常量的更多优化(例如将 n * 12
替换为 (n << 3) + (n << 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
在性能非常重要的重复算术运算中,按位运算符对性能有正面影响还是负面影响?我尝试 Google 它但无法得到明确的答案。
例如我应该使用这个:
int s = 15 << 4;
或者这个:
int s = 15 * 16;
提高我的应用程序的性能。
operator precedence 也与绩效相关吗?
在这种情况下,您可以使用其中之一。
两者都是 compile-time 可计算常量表达式,因此 编译器 将执行该操作。所以运行时根本不会受到影响。
如果您设计了一个仅在运行时可评估的示例,那么就很难说了,但如果我是您,无论如何我都会相信编译器。始终为您的任务使用适当的运算符,以免出现错误。您始终可以分析性能。
即使这些操作不是compile-time constant expressions(例如n << 4
),虚拟机在JIT编译时也会select更快的执行,所以你可以写成任何一种这对你来说是最易读的。性能将相同。
这里是 HotSpot JVM C2 JIT 编译器的 the C++ code,它用左移将乘法替换为 power-of-two。在下面,您可能会发现一些常量的更多优化(例如将 n * 12
替换为 (n << 3) + (n << 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