安卓系统是否削弱了ARM的Jazelle技术?

35

我看到Android“篡改”Java字节码的正当理由是性能(我怀疑还有其他原因)。然而,通过更改字节码,他们是否使Jazelle等硬件加速技术无效,从而实际上降低了移动Java平台的可用性能?

对于一个基于ARM的移动平台来说,这似乎与常识相悖。虽然在其他CPU架构上可能会提供更好的性能,但似乎它对ARM和Jazelle不利。

它对Java性能有什么数量级的影响?

它是否真的能提高性能,如果可以,如何提高?

它对其他平台的影响是什么?(例如x86、mips等...)


4
我认为这与编程无关的看法站不住脚。 - Eugene Yokota
2
Jazelle已经大多消失了。一些内核只实现了entry/exit/undefined-instruction-trap,并依赖于库来实现整个过程,这比在软件中直接完成要慢。 - rsaxvc
3个回答

19

是的,Dalvik使Jazelle变得无用。唯一的问题是,Jazelle一开始是否有用,还是90%的营销炒作?一个优秀的JIT或AOT(预先编译)编译器往往比尝试使用专门的指令效果更好。 Dalvik的寄存器基础方法可能比传统的Java字节码解释器更快,但如果与JIT相比只是小幅度的区别,那么区别就不大了。希望Android的下一个版本之一有一个JIT。

编写具备最先进垃圾回收器和优化器的良好虚拟机需要大约5-10年时间。Sun(和微软)花费了这些年的时间。 Google没有。希望他们会继续投资,以便有一天,Android Java代码不会比它应该慢90%。


我的意图不是要反驳你的答案,而只是想获得更多信息。 - NoMoreZealots
4
Jazelle的表现很好(比普通字节码快2-4倍),但仍然比JIT慢2-4倍以上。如果你读过Sun HotSpot的论文,你可以看到现代JIT通过代码流分析所能做的优化(函数内联、消除虚函数调用开销、消除同步需求、避免对象分配等)。Jazelle无法完成任何这些优化。Jazelle还不错,但如果你可以选择386、486和Core 2之间的话,我会选Core 2。 - hacken
2
我没有看到很多好的基准测试来比较Jazelle。我猜缺乏信息说明了问题,如果我能找到它们,那么这些基准测试也不会有太大的意义。那么,这是否表明,Java虚拟机在硬件上的移植性不如在软件上? - NoMoreZealots
Jazelle最适合在低端ARM平台上使用?这个说法公正吗? - NoMoreZealots
1
如果你的内存受限,Jazelle 比 JIT 更好。如果你的 CPU 受限,JITs(一般情况下,有例外)会给你更高的性能。如果你使用的是真正低端的嵌入式设备,请跳过使用 Java 虚拟机,直接将你的 Java 编译成汇编语言。 - hacken
显示剩余2条评论

5

维基百科:Dalvik虚拟机

与大多数虚拟机和真正的Java虚拟机(JVM)不同,Dalvik VM是一种基于寄存器的架构。

Dalvik针对低内存要求进行了优化,具有一些特定的特征,使其与其他标准VM有所区别:

  • VM被精简以使用更少的空间。
  • Dalvik没有即时编译器。
  • 常量池已被修改为仅使用32位索引以简化解释器。
  • 它使用自己的字节码,而不是Java字节码。

此外,Dalvik被设计为设备可以有效地运行多个VM实例。

编辑: 请参阅维基百科:开放手持设备联盟。创始成员包括英特尔、摩托罗拉、高通和德州仪器。ARM于2008年12月加入。因此,当目标是创建开源iPhone/Blackberry竞争对手时,这些公司依赖于一个非成员的专有技术就没有意义了。


我明白对于纯软件实现是这样的,但Jazelle在该平台上增加了另一个变量,使得性能不再那么简单和明确。 - NoMoreZealots

2
我原本认为Dalvik更注重空间效率而非执行效率。同样来自维基百科的信息:
“一个未压缩的.dex文件通常比从相同的.class文件派生出来的压缩.jar(Java Archive)文件小几个百分点。”
虽然当前的手机可能使用带有Jazelle支持的ARM,但这并不一定会持续下去。
同样来自维基百科(注意:传闻):
“发布的规范非常不完整,仅足以编写能够支持使用Jazelle的JVM的操作系统代码。声明的意图是只有JVM软件需要(或被允许)依赖硬件接口细节。这种紧密的绑定促进了硬件和JVM可以共同发展而不影响其他软件。实际上,这使得ARM控制了哪些JVM能够利用Jazelle。它还防止开源JVM使用Jazelle。”
一旦他们向Dalvik添加JITter,所有这些都将无关紧要。

炒作称基于寄存器的模型应该能提高性能。请查看eed3si9n的帖子。我曾经读到Jazelle比仅有JIT更好地提供了性能,我认为JITter也是如此。实际上,我不确定,但我知道ARM拥有一整套旨在提高性能的Java相关技术,包括混合JIT/Jazelle操作,但这可能只是营销噱头。 - NoMoreZealots

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接