开发 Android 有几年了,来回答一下这个问题。
首先我们假定题主的问题是想问 Android 的性能看起来不如 iOS 是不是虚拟机的锅?如果不用虚拟机能否改善性能。
其次我们不讨论 Android 虚拟机是不是 JVM 的问题,因为虽然其中有一些实现上的差异,但是大致的原理是接近的。在这里探讨 ART 不是 JVM,是没有太大意义的。
那么先回答第一个问题,部分是,但不都是。
Android 的处理器整体跟 iOS 还有很大差距。这点从基准测试的跑分上就能看出来。基准测试使用的是 C 编写的代码,是不受运行时的那些机制限制的。这是性能不如 iOS 设备的大头。
Android 在近几年极大地改善了运行时性能。即使在 ART 之后,对于性能的改进也从未停止。但是受限于 Java 语言对于 JNI 的限制过于宽松,导致在大量需要跟 C 语言进行交互的计算的时候就没那么方便,需要频繁切换。
有些语法从 Java 继承而来,就导致了一些优化不太容易,比如泛型里的强制类型转换。C++ 和 C# 就没有这样的问题。
第二个问题,未必。
因为运行时是会做代码优化的。程序员手写的代码,未必会有运行时优化过的效率更高。去掉了运行时的垃圾回收等功能之后,程序的可靠性也会受到挑战。(这里不是说一定会出现可靠性问题,但是起码90%的程序员会因为内存问题而消耗更多的时间排查)。即使在具有自动回收功能的运行时上,仍然会出现内存泄漏的问题,更不用提手动回收了。
说句题外话,运行时是现代语言的一大特征。近几年新出现的流行语言,几乎都使用了运行时。从长远来看,设计良好的运行时,会随着硬件性能的不断提升,对程序运行的性能影响占的比例越来越低。
Java 的运行时从概念上讲,对比无运行时,是先进的。从性能来讲,未必是最优解,但是结合 Android 诞生的年代和生态来说,Android 的先驱们无疑是做出了非常正确的决定。随着近几年硬件性能的提升和系统不断的优化,因为性能问题而抛弃掉 Java,就显得没那么必要了。