Bee*_*ope 7 java jvm-hotspot compiler-optimization
纯方法是没有副作用的方法:它们唯一的作用是返回一个值,该值是它们的参数的函数.
使用相同参数对同一个纯方法的两次调用将返回相同的值.因此,如果对具有相同参数的纯方法进行两次调用,HotSpot可以优化第二次调用,只需重新使用第一次调用的值吗?
例如:
int add(int x, int y) {
return x + y;
}
int addTwice(int x, int y) {
return add(x, y) + add(x, y);
}
Run Code Online (Sandbox Code Playgroud)
如果热点不内联add内addTwice它理解add为纯粹的,因此呼吁add只有一次,双倍返还价值?
当然,这样一个微不足道的[mcve]不太可能是直接感兴趣的,但是由于内联,不同的控制流,自动生成的代码等,在实践中可能会发生类似的情况.
到目前为止,HotSpot无法做到这一点.
如果没有内联,则JIT编译器的方法调用通常是不透明的.很难进行跨方法优化.其中一个原因是方法入口点是易失性的,即它可以在运行时由于JIT编译,重新编译,去优化,JVMTI调用等而同时更改.当HotSpot进行显式方法调用时,它不知道目标方法是否被解释或编译,它是否收集JIT统计信息,是否正在调试,是否在内部有断点,或者是否启用了JVMTI方法事件.
另一方面,即使存在这样的优化,也不会太有用.纯粹的方法在他们能做的事情上非常有限,因此它们通常简短而且有很多机会被内联.在内联之后,JIT可以更容易地在同一编译范围内进行优化.
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |