我有一个关于 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(...) 更具可读性。
如果不是,那么一遍又一遍地重复实例化相同/相等值的其他原因是什么?
您个人是如何做到的?
我还能从哪里得到问题的答案?
最佳答案
这并不是一个真正的 JIT 问题。两个版本的代码之间的区别在于缓存的有效程度。
在一个版本中,从长远来看,您会消耗更多空间,因为
STATIC_VALUE
在Spielwiese
类(可能是应用程序)的生命周期内是可访问的。在另一个版本中,每次调用该方法时,您都会构造并丢弃一个额外的
BigDecimal
对象。
无论 JIT 编译如何,情况都会如此。
<小时/>我会做什么?
首先,除非我的直觉告诉我性能可能很重要,否则我可能会针对可读性进行优化。从程序员生产力的角度来看,这种微观优化很少值得。
如果我需要针对频繁调用该方法的情况进行优化,则 STATIC_VALUE
方法(IMO)可能会更快一些。对静态变量的引用是单个字节码,并且可能会转换为单个机器指令。 (或者也许是两个)。构建新的 BigDecimal
值将需要更多数量级的指令。
如果我需要优化内存使用,那么哪个更好是有争议的。然而,这两种方法之间的差异可能很小,以至于很难实际测量。
<小时/>Where else could I have gotten an answer to my question?
你可以自己得到答案:
- 通过创建基准并进行衡量,或者
- 通过使用输出 JIT 编译代码的 JVM 选项...并分析代码。
关于java - 使用静态全局变量或内联变量 - 哪个更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51962362/