我正在分析 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 中进一步检查,似乎这个问题与调用其他默认接口方法的默认接口方法有关。考虑到“无静态绑定”消息,这会更有意义。