Dalvik与JVM的不同
- 执行文件不同,一个是dex,一个是class
- 类加载系统与jvm区别较大
- 可以同时存在多个DVM
- Dalvik基于寄存器,JVM基于栈(寄存器是比内存更快的存储介质)
ART比Dalvik优势
- DVM使用JIT来将字节码转换成机器码,效率低
- ART采用了AOT预编译技术,执行速度更快(安装时字节码转换成机器码)
- ART会占用更多的应用安装时间和存储空间
基于寄存器与基于栈的工作原理是什么,为什么会导致效率更高?
https://blog.csdn.net/weixin_34315665/article/details/91385577
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
基于寄存器与基于栈虚拟机的比较
- 可移植性:栈 > 寄存器
栈的操作都是通过操作数栈来完成,而不是直接操作CPU。JVM目标是跨平台,所以选择了这种比较中庸的办法。 - 代码量 : 栈 < 寄存器
- 执行效率: 栈 < 寄存器
网友评论