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



我有一个关于 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程序会看到新的BigDecimal("5"(指令实际上可以被静态用法取代吗? - 这可能会使doSomeComputing1(...(更具可读性。

如果不是,还有什么其他原因可以一遍又一遍地重复实例化相同/相等的值?

你个人是怎么做到的?

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

这不是一个真正的 JIT 问题。 代码的两个版本之间的区别实际上是关于缓存的。

  • 在一个版本中,从长远来看,您会消耗更多空间,因为STATIC_VALUESpielwiese类的生存期内可以访问这些空间:可能是应用程序。

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

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


我会怎么做?

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

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

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


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

你可以自己得到答案:

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

最新更新