技术开发 频道

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
相关文章