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