android面试-ART与Dalvik

时间:2022-03-14 17:43:02

一、ART与Dalvik区别:

ART 的机制与 Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。

一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。

二、Stack-Based虚拟机

    一个基于Stack的虚拟机会通过IP来获取操作数,其操作数都是保存在Stack数据结构中,从栈中取出数据、计算然后再将结果存入栈中(LIFO,Last in first out)。

如下就是一个典型的计算20+7在栈中的计算过程:

android面试-ART与Dalvik

android面试-ART与Dalvik

   1、POP 20
   2、POP 7
   3、ADD 20, 7, result
   4、PUSH result

三、Register-Based虚拟机

    基于寄存器的虚拟机,它们的操作数是存放在CPU的寄存器的。没有入栈和出栈的操作和概念。但是执行的指令就需要包含操作数的地址了,也就是说,指令必须明确的包含操作数的地址,这不像栈可以用栈指针去操作。比如如下的加法操作:

android面试-ART与Dalvik

android面试-ART与Dalvik

    ADD R1, R2, R3 ;就一条指令搞定了。
    正如前面所说,基于寄存器的VM没有入栈和出栈的操作。所以加法指令只需要一行就够了,但是不像Stack-Based一样,我们需要明确的制定操作数R1、R2、R3(这些都是寄存器)的地址。这种设计的有点就是去掉了入栈和出栈的操作,并且指令在寄存器虚拟机执行得更快。

四、面试回答

个人感觉回答这个问题首先得了解清楚基于寄存器与基于栈的虚拟机有什么区别,然后ART优势在哪里,为什么ART会比较快。