我使用 JMH来指定操作的复杂性。如果您从未与JMH合作过,请不要担心。 JMH将多次启动estimateOperation
方法,然后获得平均时间。
问题:[缩小] 此程序每次都会计算Math.cbrt(Integer.MAX_VALUE)
吗?或者它只计算一次然后返回缓存结果?
@GenerateMicroBenchmark
public void estimateOperation() {
calculate();
}
public int calculate() {
return Math.cbrt(Integer.MAX_VALUE);
}
问题:[广泛]: JVM是否会缓存方法的结果?
答案 0 :(得分:8)
方法返回值永远不会缓存。但是,由于某些优化,如常量折叠,常量传播>,JIT编译器可能会在运行时消除 消除 em>,死代码消除,循环不变提升,方法内联等。
例如,如果用Math.cbrt
或Math.sqrt
替换Math.pow
,则在JIT编译后根本不会调用该方法,因为调用将被常量替换。 (优化不适用于cbrt
,因为它是一种罕见的方法,它属于JVM没有内化的本机调用。)
答案 1 :(得分:2)
没有
简单地说,Java不会缓存方法结果,因为方法每次都可以返回不同的值。
答案 2 :(得分:2)
是的,它会在每次调用时调用该代码
public int calculate() {
return Math.cbrt(Integer.MAX_VALUE);
}
public double calculate();
Code:
0: ldc2_w #3 // double 2.147483647E9d
3: invokestatic #5 // Method java/lang/Math.cbrt:(D)D
6: dreturn
要缓存,只需用
替换该幻数私人静态最终字段
private static final double NUMBER = Math.cbrt(Integer.MAX_VALUE);
答案 3 :(得分:2)
回答狭义问题:这取决于JVM的实现以及代码的解释方式。
回答广泛的问题:不,因为正如Anubian所指出的,方法可以在每次调用时返回不同的值。