VB_*_*VB_ 5 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);
}
Run Code Online (Sandbox Code Playgroud)
问题:[broad]: JVM是否会缓存方法的结果?
永远不会缓存方法返回值.但是,由于某些优化,如常量折叠,常量传播,死代码消除,循环不变提升,方法内联等,JIT编译器可能会在运行时消除不必要的调用.
例如,如果Math.cbrt
用Math.sqrt
或替换,则Math.pow
在JIT编译后根本不会调用该方法,因为调用将被常量替换.(优化不起作用cbrt
,因为它是一种罕见的方法,它属于JVM没有内化的本机调用).