Dalvik和ART的区别
- Dalvik环境下,应用每次运行时,字节码都需要通过即时编译器(Just In Time,JIT)转换为机器码,这样每次应用启动的速度就会非常的慢。ART环境中,应用会在安装的时候,就将字节码预编译(Ahead of Time,AOT)成机器码,使其成为真正的本地应用。因此在ART环境中,应用除了在安装的时间上比Dalvik要长以外,启动和执行的速度都会比Dalvik要更快。
- ART占用的空间比Dalvik大,实际上就是用空间换时间,之所以会更大也是因为预编译的时候会将字节码转换成机器码,空间大概会增加10%~20%。
- ART不用每次运行时都重复编译,减少了CPU的使用频率,降低了能耗。
所以说,在ART的模式下,手机续航的能力会更强,总的来说,ART和Dalvik的主要区别就是一个是预编译(Ahead of Time,AOT),另外一个是即时编译(Just In Time, JIT)。
基于栈的JVM | Dalvik(基于寄存器) | |
---|---|---|
字节码单元长度 | 8位(1字节) | 16位(2字节) |
单条指令长度 | 短 | 几乎翻倍 |
同样逻辑指令条数 | 多 | 少 |
同样逻辑数据移动次数 | 多 | 尽可能少 |
同样逻辑临时结果存储次数 | 多 | 尽可能少 |
如何看待基于栈的虚拟机设计?
- JVM基于栈设计的初衷之一,是压缩代码体积
- java设计之初最重要的一个特性就是跨平台,支持嵌入式设备和手持设备(J2ME)。
- java设计之初的另一个特性,支持远程传输执行字节码,要降低传输开销。
- 基于栈的虚拟机,字节码实现简单
- 指的是生成字节码的过程简单,而不是虚拟机本身简单,或者说是编译器的实现简单。
- 操作时,不用考虑寄存器的地址(绝对位置),只需要把想要操作的数据出栈、入栈,然后再实现如何针对栈进行操作就可以了。
- 基于栈的虚拟机,可移植性高
- 为了提高效率,虚拟寄存器要映射到真实机器的寄存器,增加移植难度。
- 代码移植到其他硬件平台的时候,不用考虑真实机器寄存器的差异,因为操作栈的指令是通用的。
如何看待Android平台基于寄存器的设计?
- 更快,更省内存
- 指令条数少
- 数据移动次数少,临时结果存放次数少
- 映射真实机器的寄存器
- Android不需要解决移植性问题
- Android平台的操作系统的统一的
- 用其他方式解决了代码体积问题
- dex文件优化