Hao*_*ang 7 java optimization jit jvm jvm-hotspot
我正在分析 HotSpot 日志以获得在 JITWatch 中为一段代码运行的基准测试,并注意到由于“没有静态绑定”而没有内联许多方法调用。这些似乎只发生在调用默认接口方法时。
我的问题是默认接口方法是否会阻止 JIT 编译器内联它们的调用?
interface A {
default double a() {
return Math.random();
}
}
interface B extends A {
default double b() {
return a();
}
}
class C implements B {
public double c() {
double c = 0;
for (int i = 0; i < 1_000_000; ++i) {
c += b();
}
return c;
}
public static void main(String[] args) {
System.out.println(new C().c());
}
}
Run Code Online (Sandbox Code Playgroud)
在 JITWatch 中进一步检查,似乎这个问题与调用其他默认接口方法的默认接口方法有关。考虑到“无静态绑定”消息,这会更有意义。
Eugene 的示例表明默认方法可以内联。
事实上,我认为内联的标准应该与任何其他非静态方法相同。
在您的示例中,我认为内联应该是可能的,假设这是示例中涉及的所有代码。
但是,此处使用的特定 JIT 中的 / 可能存在其他限制。例如,调用另一个默认方法的默认方法可能是一种边缘情况,这种情况非常罕见,以至于被认为不值得支持。另一个可能的解释是 C1 编译器不进行深度单态调度分析/优化。
另一方面,这可能是过早的优化……除非您的性能分析已识别出代码中的特定热点,在该热点中内联可能会产生重大影响。通常,最好的策略是将其留给编译器。如果您对代码进行微优化,以便为给定的 Java 版本提供最佳性能,那么当您更改为新版本时,您很可能需要重做这项工作。
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |