Java虚拟机会比硬件快吗?
二、Java处理器
Java虚拟机规范有它自己的一套说明集合。这些说明中的某一些看起来很像那些将会找到一个典型的CPU指令转码的Java虚拟机指令集合,它将会Java代码执行的性能,这个观察是有根有据的。但是,这种误解是硬件加速也会与虚拟机JIT匹配带来更好的性能。在JIT编译情况下,一个Java处理器将会打败JIT的性能。注意:在接下来的讨论中,我将会简化硬件Java处理器为JPU。
声明:我不会对市场上的任何的硬件和Java处理器实现发表任何评论,而仅仅是从理论的观点来看待问题。
好了,让我们来看一个简单而又特别的例子。
三、一个简单的例子
三、一个简单的例子
这里有一段用Java编程语言写的一小段程序段:
a = a + b; // 将两个整数相加.
当编译成字节码的时候,程序段将会变成如下这样:
iload_0 //蒋a放入堆栈中.
iload_1 // 将b放入堆栈中.
iadd //弹出这两个值,并将两者相加,
//将得出的结果推入堆栈
istore_0 //蒋结果保存到a中.
虚拟机的解释器
这儿说明了虚拟机解释器是如何执行上述的代码的:
// opc_iload_0:
ldr r4, [fp, #-140] //获得本地变量起始的地址locals
ldrb r3, [r8, #1]! //计算第一段
ldr r2, [r4, #0] //加载本地的0
ldr r1, [r9, r3, asl #2] //计算第二段
str r2, [rJSP], #4 //将值放入堆栈中
mov pc, r1 //分出下一个段
...
// opc_iadd:
sub r4, rJSP, #8 //计算变量的堆栈位置
ldmia r4, {r2, r4} //加载变量,例如.从内存中加载两个字的空间from memory
add r2, r2, r4 //执行加操作
ldr r1, [r9, r3, asl #2] //计算下一个段
str r2, [rJSP, #-8] //存储结果到堆栈中、
sub rJSP, rJSP, #4 //调整堆栈指针
mov pc, r1 //分出下一个段
...
// opc_istore_0:
ldrb r3, [r8, #1]! //计算下一个段
ldr r2, [rJSP, #-4]! //从堆栈中弹出值
ldr r4, [fp, #-140] //获得本地起始的地址
ldr r1, [r9, r3, asl #2] //计算一个个部分
str r2, [r4, #0] //将值放入本地的0
mov pc, r1 //分出下一个段
...
如上所述通过编译CVM的解释器循环运用gcc进入ARM。我挑选ARM仅仅作为指令集的一个例子。我的目的是获得一个真实世界的例子,这个例子能够做一些耗时的工作。但是,我把一些注册名用符号等价物来表示,使得集合的代码更加容易理解。JSP是包含Java堆栈指针的一个注册器。
0
相关文章