结论:Dalvik虚拟机是基于寄存器之上,而JVM虚拟机基于栈。Dalvik虚拟机的效率会更高。
1.基于寄存器与基于栈的工作原理是什么,为什么会导致效率更高?
1.1栈虚拟机
栈,后进先出,听起来就很黄的样子。这里面有一个叫做操作数栈的概念。任何对于内存的操作都要经过这个操作数栈,尽管这个操作数栈,与变量同在内存里,依然需要先传递到操作数栈,然后再由操作数栈进行处理。看图:
当我们声明一个int a = 11; 的时候,虚拟机需要先将11从变量表,传递到操作数栈中,才能够进行使用。
如果进行一个简单的加法,int a = 11;int b = 22;int c = a + b;
基于栈的虚拟机上字节码指令如下所示:
1.load a;
2.load b
3.add
4.storge c
字节码很短,但是行数很多。
另外,每次将变量从变量表copy至操作数栈中,都要经过CPU总线进行传输(虽然都在内存里,但是内存之前的数据传递还是要走CPU总线)。也就是说,load a 一次,先把数据传至CPU,CPU再将数据放入,数据栈。
1.load a -> cpu -> 数据栈 ,2次
2.load b -> cpu -> 数据栈 ,2次
3.add 从操作数栈中传递至CPU 2次 ,add 操作完放回操作数栈,3次
4.storge c 操作数栈 -> CPU -> 数据表,2次。
这个就是基于栈的虚拟机效率问题,一次加法操作,经过CPU次数9次。
1.2寄存器虚拟机
基于寄存器的虚拟机则没有操作数栈的概念,寄存器本身就是CPU的一部分用于存放指令,数据和地址,因此寄存器操作一次简单的加法,只要找到a,找到b,将a和b送入CPU中去进行计算,CPU将计算结果送回寄存器。
只要3次。
而且字节码只有一句
1.add a, b, c
2.基于寄存器与基于栈虚拟机的比较
可移植性:栈 > 寄存器
栈的操作都是通过操作数栈来完成,而不是直接操作CPU。JVM目标是跨平台,所以选择了这种比较中庸的办法。
代码量 : 栈 < 寄存器
执行效率: 栈 < 寄存器