应用开发人员通常用 Java* 语言编写应用的某一部分。 本 Java 代码可转换成特定于 Android 的字节码,名为 Dex 字节码。 在不同的 Android 主要版本中,有许多方法将字节码格式转换成在处理器上运行的实际二进制格式。 例如,在 Jelly Bean* 版本中,运行时中有一个即时 (JIT) 编译器,称为 “Dalvik* VM”。 从 KitKat* 起,出现了 Android 运行时 (ART),将提前 (AOT) 编译器添加至了 ART。
英特尔对 ART 编译器实施的两项优化。 这两项优化均可帮助简化编译时评估循环。 这些只是英特尔践行提供最佳 Android 操作系统用户体验的承诺时所采取的一部分措施,我们此次介绍的目的是为了展示这些措施如何显著优化了综合基准测试。
自 2008 年起,出现了 3 个不同的 Google Android 编译器。 Dalvik Jit 编译器自 Froyo 起推出,后来被 Lollipop 版 Android 的 Quick AOT 编译器所取代。 这种替代体现了 Dex 字节码转换模式的主要变化,即 Android 的 Java 字节码版本转换成了二进制代码。 由于这种变化,Dalvik VM 的大多数中端优化逻辑被拷贝至 Quick。而且,尽管 AOT 编译能够为编译器提供更多编译复杂优化的时间,但 Quick 提供与 Dalvik VM 类似的基础架构和优化。 2014 年底,AOSP 新增了一个新的编译器,名为 “Optimizing”。 这个最新版编译器完全改写了 Quick 编译器,而且,随着时间的推移,它似乎正添加越来越多的基础架构来支持更多高级优化,这对之前的编译器版本来说几乎是不可能的。
同时,英特尔一直致力于将自己的基础架构和优化融入至 编译器,以支持基于英特尔处理器的设备提供最佳的用户体验。 在介绍英特尔对 Android 编译器实施的优化之前,下一部分将展示生产编译器常用两项小优化,以帮助更好理解这两项英特尔优化。
常量运算汇集是一项重要的优化。 单独考虑时,不能立即明白它是否适用于真实案例,但游戏示例展示了如何确认候选循环。 集成优化有助于优化通过譬如 inliner 方法转换的循环。
就常量运算汇集优化而言,综合基准测试 CF-Bench 在几项子测试得分方面收到了成效。 在编译器方面,很少获得数量级的加速,比如该基准测试所获得的加速。 这说明,转换至 MIPS 子测试得分会影响未来适用于其他子测试的优化。
当所有循环输入都适用于编译器时,次要循环评估程序将成为一项强大的优化。 如要采用这项优化,其他优化(比如 inlining)也必须同时出现。 这对本文探讨的两项优化至关重要:开发人员通常不编写本身适用的循环。
如欲了解有关这些优化的更多信息,请阅读: 了解 Android* 运行时编译器中的英特尔® 优化