java - JVM 是否优化别名变量?

标签 java variables optimization jvm

我很好奇。如果我创建一些仅用作其他变量的别名的局部变量(也就是说,一个新的“别名”变量只是被分配了其他变量的值,并且别名的分配永远不会改变),JVM是否会通过以下方式优化它:直接使用原始变量?

例如,我正在编写一个(不可变的)四元数类(quaternion 是一个具有四个值的 vector )。我编写了一个 multiply() 方法,该方法采用另一个 四元数,将两者相乘,然后返回所得的四元数。为了节省打字时间并提高可读性,我在执行实际计算之前创建了几个别名:

public class Quaternion {

    private double[] qValues;

    public Quaternion(double q0, double q1, double q2, double q3) {
        qValues = new double[] {q0, q1, q2, q3};
    }

    // ...snip...

    public Quaternion multiply(Quaternion other) {
        double a1 = qValues[0],
                 b1 = qValues[1],
                 c1 = qValues[2],
                 d1 = qValues[3],

                 a2 = other.qValues[0],
                 b2 = other.qValues[1],
                 c2 = other.qValues[2],
                 d2 = other.qValues[3];

        return new Quaternion(
                    a1*a2 - b1*b2 - c1*c2 - d1*d2,
                    a1*b2 + b1*a2 + c1*d2 - d1*c2,
                    a1*c2 - b1*d2 + c1*a2 + d1*b2,
                    a1*d2 + b1*c2 - c1*b2 + d1*a2
                );
    }

}

因此,在这种情况下,JVM 是否会取消 a1b1 等,而只使用 qValues[n] 和直接other.qValues[n]

最佳答案

不存在您在 Java 中描述的别名之类的东西。当您将一个内存位置中的值分配给新变量时,JVM 会复制该值。如果要创建别名,则在计算过程中从另一个线程更改底层数组将会改变结果。这在您的示例中不会发生,因为您明确告诉 JVM 首先复制值。

如果您担心性能,请不要担心。程序的正确性胜过所有性能问题。任何更快地产生错误结果的程序都是毫无值(value)的。我并不是说直接在计算内部访问数组必然会产生不正确的结果,因为我还没有看到其余的代码,但我是说,如果不先找到一个合适的方法,这种类型的微优化不值得您付出努力。性能问题,然后执行时序测试来验证问题所在。

关于java - JVM 是否优化别名变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628909/

相关文章:

Java FizzBu​​zz 1 行

jquery - 将变量传递给 Jquery 函数

php - 帮助我理解 PHP 变量引用和作用域

php - 如何动态压缩 JS 或 CSS

java - 从Google代码编译java项目的说明

java - 使用来自不同线程的 JMS session

java - 如果线程花费太长时间,如何结束执行程序服务中的线程?

iphone - 如何调用采用可变数量参数的方法的父类(super class)实现,如 [UIAlertView initWithTitle ...]?

haskell - 存在量化类型的内存占用和相关优化技术

php - 在 PHP 中执行 "foreach x except y"最优雅的方法是什么?