java缓存方法的结果
我使用 JMH来指定操作的复杂性。 如果您从未与JMH合作过,请不要担心。 JMH将多次启动estimateOperation
方法,然后获得平均时间。
问题:[narrow]这个程序每次都会计算Math.cbrt(Integer.MAX_VALUE)
吗? 或者它只计算一次然后返回缓存结果?
@GenerateMicroBenchmark public void estimateOperation() { calculate(); } public int calculate() { return Math.cbrt(Integer.MAX_VALUE); }
问题:[broad]: JVM是否会缓存方法的结果?
永远不会缓存方法返回值。 但是,由于某些优化,如常量折叠 , 常量传播 , 死代码消除 , 循环不变提升 , 方法内联等,JIT编译器可能会在运行时消除不必要的调用。
例如,如果将Math.cbrt
替换为Math.sqrt
或Math.pow
,则在JIT编译后将不会调用该方法,因为该调用将被常量替换。 (优化对cbrt
,因为它是一种罕见的方法,它属于JVM没有内化的本机调用)。
没有。
简单地说,Java不会缓存方法结果,因为方法每次都可以返回不同的值。
是的,它会在每次调用时调用该代码
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);
回答狭义问题:它取决于JVM实现以及如何解释代码。
回答广泛的问题:不,因为正如Anubian所指出的那样,方法可以在每次调用时返回不同的值。