我对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(...)更具可读性。
如果不是,那么为什么要重复一遍又一遍地重复相同/相等值的实例?
您个人如何做?
我还能在哪里得到我问题的答案?
答案 0 :(得分:1)
这不是一个真正的JIT问题。两种版本的代码之间的区别在于缓存的有效性。
在一个版本中,长期使用更多空间是因为STATIC_VALUE
类的生命周期内可以到达Spielwiese
:可能是应用程序。
在另一个版本中,每次调用该方法时,您都会构造并丢弃一个额外的BigDecimal
对象。
无论JIT编译如何,都是如此。
我会做什么?
首先,除非我的直觉告诉我性能可能会重要,否则我可能会针对可读性进行优化。从程序员生产率的角度来看,这种微优化很少值得。
如果我需要针对频繁调用该方法的情况进行优化,则STATIC_VALUE
方法可能会更快(IMO)。对static
变量的引用是单个字节码,并且很可能转换为单个机器指令。 (或者两个)。构造新的BigDecimal
值将需要更多数量级的指令。
如果我需要针对内存使用进行优化,则值得商which,这会更好。但是,两种方法之间的差异可能很小,难以实际测量。
我还能在哪里得到我问题的答案?
您可以自己回答: