使用静态全局变量或内联变量-哪一种效率更高?

时间:2018-08-22 08:04:35

标签: 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").multiply( bd );
    }

    public static BigDecimal doSomeCalculation2(BigDecimal bd) {
        return STATIC_VALUE.multiply( bd );
    }
}

正在运行的Java程序是否会看到 new BigDecimal(“ 5”)指令实际上可以被静态用法所代替? -这可能会使 doSomeCalculation1(...)更具可读性。

如果不是,那么为什么要重复一遍又一遍地重复相同/相等值的实例?

您个人如何做?

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

1 个答案:

答案 0 :(得分:1)

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

  • 在一个版本中,长期使用更多空间是因为STATIC_VALUE类的生命周期内可以到达Spielwiese:可能是应用程序。

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

无论JIT编译如何,都是如此。


我会做什么?

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

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

如果我需要针对内存使用进行优化,则值得商which,这会更好。但是,两种方法之间的差异可能很小,难以实际测量。


  

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

您可以自己回答:

  • 通过创建基准并进行测量,或者
  • 使用JVM选项输出JIT编译的代码...并分析代码。