Android ART运行时是一个提前(aot)编译器,与Dalvik和Hotspot相反,后者进行即时(jit)编译。
jit编译的一个优点是它可以内联不可证明是正确目标的方法。在这样的代码中:
public class Foo {
public int doOperation(int a, int b) { return a + b; }
}
public class Bar {
public int doIt(int a, long repeat, Foo foo) {
for (long i = 0; i < repeat; i++) {
a = foo.doOperation(a, 1);
}
return a;
}
}
通常无法将doOperation
内联到doIt
,因为可以创建一个覆盖DerivedFoo
方法的派生类doOperation
。对于Java,这样的DerivedFoo
类不需要在编译时出现,但可以在运行时或(在HotSpot上)存在,甚至可以在运行时动态生成。
jit编译的一个优点是编译器可以专门处理正在使用的确切代码和类型,例如: HotSpot可以在上面的代码中内联doOperation
调用,并且如果结果表明传入的foo
不是假定的Foo
,则会动态地进行优化。
Android ART会提前进行编译,因此无法进行此类优化,除非它假定编译时所有代码都存在并且看不到其他类派生自Foo
。
ART是否做出这样的假设,并且能够在编译过程中使用它,例如在上面的代码中将doOperation
内联到doIt
?如果没有,如果标记为doOperation
?
final