java缓存方法的结果

时间:2014-06-15 20:15:43

标签: java caching jvm microbenchmark jmh

我使用 JMH来指定操作的复杂性。如果您从未与JMH合作过,请不要担心。 JMH将多次启动estimateOperation方法,然后获得平均时间。

问题:[缩小] 此程序每次都会计算Math.cbrt(Integer.MAX_VALUE)吗?或者它只计算一次然后返回缓存结果?

@GenerateMicroBenchmark
public  void estimateOperation() {
    calculate();
}

public int calculate() {
    return Math.cbrt(Integer.MAX_VALUE);
}

问题:[广泛]: JVM是否会缓存方法的结果?

4 个答案:

答案 0 :(得分:8)

方法返回值永远不会缓存。但是,由于某些优化,如常量折叠常量传播,JIT编译器可能会在运行时消除 消除 em>,死代码消除循环不变提升方法内联等。

例如,如果用Math.cbrtMath.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所指出的,方法可以在每次调用时返回不同的值。