Android ART是否假设所有代码都在编译时出现?如果是这样,它是否可以利用它进行优化?

时间:2016-08-25 14:38:48

标签: android compilation jit dalvik

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

0 个答案:

没有答案