技术开发 频道

Java虚拟机会比硬件快吗?



四、复杂的字节码
请等一下,这并不是整个故事。我说过我上面选择的例子是如此的简单,因此它并没有显示JPU的最好的性能。注意:即使当JPU在这场游戏中是最好的,JIT仍然将趋向于打败它的性能。现在在虚拟机指令集中考虑字节码的复杂性(点击这儿来获得虚拟机的字节码的相关术语)。
虚拟机指令集也包括例如new(为了分配对象)、newarray(为了分配数组)、monitorenter(为了锁定一个对象)、monitorexit(用于解锁某个对象)和属性进入器,例如getfieldgetstaticputfieldputstatic和一些复杂的字节码。
我说字节码“复杂”是因为它的执行不能在硬件中做。例如,“new”需要与虚拟机的垃圾收集器在一起才能正确工作,“moitorenter”需要与虚拟机的同步和线程机制协作才能正确工作,等等。在属性进入情况下,字节码必须接触类的常量表,这些常量表能够具有不同的实现,这取决于软件的虚拟机实现。常量库的进入将也会需要在属性进入之前被解决(在其余的事情之间)。
JPU支持这些字节码的唯一方式是去调出软件处理例行测试。注意:在Java程序中,这些字节码的使用实际上是很常见的。这就意味着当真实世界的程序执行的时候,JPU将不会意识到它的非常好的速度是可能的。真实世界的程序并不仅仅做循环操作,它还做简单的算法和逻辑操作(这些操作JPU能获得最好的性能)。
有一些JPU将会支持加速的字节码,一旦所有不同的填充物都在软件上实现,这有可能加速属性访问。但是,硬件加速的效率到底有多高,这一直是惹争议的问题。
但是让我们假定一下JPU具有所有理想的组件,这些组件能够使得它接近JIT的性能。毕竟,JIT也同样需要在软件中分配和同步,是不是呢?从技术上讲,是这样的。但是,当JIT能够对特定的虚拟机组件如何工作的时候,JIT可能有一个微小的优势,那就是它能够对特别的知识进行使用。这允许JIT在这些组件条件下发挥非常好的性能。而JPU是不能够做到的。这不是一个可供选择的选项。通常,JPU必须在某种程度上保持一般化,因为它需要不同的垃圾收集器和同步算法。如果虚拟机改变了垃圾收集器算法,使JIT在它上上面工作变得更简单。但是,如果它没有指定特定的算法,JPU将会要求新的方法,这是为什么它必须保持一般化的原因。
 五、为什么使用硬件实现?
不管怎么样,JPU有它存在的价值。在性能上它不能与JIT竞争,但是它将比软件解释器的性能要好。使用JPU的另一个原因是JPU在没有足够的钱花费在内存上得到时候非常受内存环境限制。JITk字节的内存消耗中需要10100条指令。如果这不是能够承受的消费,JPU可能是性能的最好的解决方案。注意:JPU执行Java字节码是非常紧凑的,这就意味着代码脚本更少。
最后一个你想要使用JPU的原因是:如果你想要避免JIT将导致的编译时间,这是一个有根有据的关心。但是,在实际情况下,人们趋向于指责JIT启动时的速度慢,通常,这有很多原因引起。JIT的编译时间通常对启动时间起的作用并不大。我冒昧的说出我所猜测的那个值,那就是少于5%10%的启动时间。如果在这点上你无法接受,那么JPU将会是更好的选择。
六、更深层的思考
通常很有可能的是某些人已经用了一些我无法想象的高级技术模拟了JPU。我当然不不能对这些情况发表言论。但是,上述所说在我所懂得的现今的CPU技术和架构上是现实可行的。除了JPU,其它一些Java虚拟机的硬件加速可能包括内存访问的提速和查找的提速。这些可能将产生比提升字节码执行的速度产生更好的回报。
这个只是一个入口,由此可以进行展开,希望大家具有美好的一天。

   
在上面我已经确立了某些类型并且提供了一些附加的阐述。下面是一些额外的想法,我认为这些是非常值得关注的。
JPU仅仅能够在堆栈中映像高级的操作数”。--我认为这是对的,
当然JIT也能够组另外的一些奇特的优化。
考虑到JPU在堆栈的最高层的操作数上映射,为了保持有效,JPU将需要阻止热心于加载和溢出(在镜像注册器和内存中)。热心于有效地加载/溢出获得了相同的性能,像没有使用任何注册器镜像一样。代替地,加载/溢出必须懒加载(例如,在需要的时候请求)。在最坏的情况下,这产生了没有镜像时的相同性能。在最好的情况下,内存访问在假定操作堆栈使用保持在镜像存储器容量下使用的情况下能够被避免。当然,所有的这些需要通过JPU硬件自动的处理。再者,在这里JIT有一个优点,在这里它能够在内存内容在注册起中镜像的时候进行更加明智的选择。
考虑到JIT其它的非常好的情况,我忽略去提到它们了,我前面所提及的“插入”确定无疑即使不是最大的一点,也是最大的一点之一。JPU不具有如下的选项:循环空转、不变量的挂起、通用的子表达式的排除、内在方法的使用等等。我并不是说所有的非常好的化都在JIT中实现。但是,JIT确实具有实现它们的选项,但是JPU是不具有这些选项的。
0
相关文章