Java 使用静态全局变量或内联变量-哪个更有效?

Java 使用静态全局变量或内联变量-哪个更有效?,java,static,jit,Java,Static,Jit,我有一个关于JIT的问题,这是正确的解决方法吗 例如,我有一个简单的数学任务要做,但我不知道哪种编程方式更好: public class Spielwiese { static final BigDecimal STATIC_VALUE = new BigDecimal( "5" ); public static BigDecimal doSomeCalculation1(BigDecimal bd) { return new BigDecimal("5").

我有一个关于JIT的问题,这是正确的解决方法吗

例如,我有一个简单的数学任务要做,但我不知道哪种编程方式更好:

public class Spielwiese {

    static final BigDecimal STATIC_VALUE = new BigDecimal( "5" );

    public static BigDecimal doSomeCalculation1(BigDecimal bd) {
        return new BigDecimal("5").multiply( bd );
    }

    public static BigDecimal doSomeCalculation2(BigDecimal bd) {
        return STATIC_VALUE.multiply( bd );
    }
}
运行中的java程序会看到新的BigDecimal5指令实际上可以被静态用法所取代吗这可能会使DosomeCalculation 1。。。更具可读性

如果不是,还有什么其他原因可以反复实例化相同/相等的值

你个人是怎么做到的


我还能从哪里得到我问题的答案呢?

这不是一个真正的JIT问题。这两个版本的代码之间的区别在于缓存的有效性

在一个版本中,从长远来看,您会消耗更多的空间,因为在Spielwise类的生命周期内可以访问静态_值:可能是应用程序

在另一个版本中,每次调用该方法时,构造并丢弃一个额外的BigDecimal对象

无论JIT编译如何,都会出现这种情况

我该怎么办

首先,除非我的直觉告诉我性能可能很重要,否则我可能会优化可读性。从程序员生产力的角度来看,这种微观优化很少值得

如果我需要针对频繁调用该方法的情况进行优化,静态_值方法可能会快一点。对静态变量的引用是单个字节码,很可能转换为单个机器指令。或者两个。构造一个新的BigDecimal值将占用更多指令的数量级

如果我需要优化内存使用率,那么哪个更好还是有争议的。然而,这两种方法之间的差异可能很小,难以实际测量

我还能从哪里得到我问题的答案

你可以自己得到答案:

通过创建基准和测量,或 通过使用输出JIT编译代码的JVM选项。。。分析代码。
非常感谢你有趣的回答!在我看来,JIT会神奇地一遍又一遍地看到同一个BigDecimal5的实例化,然后巧妙地说,它可以静态完成。这将针对我的可读性编程。