为了确定开始将现有的iOS应用程序(用C语言编写)移植到Android是否合理,我必须估计如果用Java实现它的速度有多快。一些问题是Java代码必须翻译多次(到字节码,然后到使用JIT的本地代码)。它可能会对实时属性(响应性)产生负面影响,对吧?
生成代码的质量如何?它在某种程度上与gcc / llvm生成的代码相当吗?如果是,您是否参考了比较结果(纸张)?
答案 0 :(得分:23)
好问题。几年前,与本机代码相比,Sun(现在的Oracle)JVM的性能会很差。但是things have changed。
首先,运行Android的VM不是您的标准JVM。它是由谷歌专门为移动设备改写的强化虚拟机,其中UI性能优先。
其次,在过去十年中发生了很多事......来自this relevant文章的一句话很好地说明了:Fifteen years ago, all we thought that Java needed to rule the known universe was a faster VM.
我们现在拥有更快的虚拟机。
最后,在性能方面,有很多关于iOS和Android之间的比较的文章。 Here's第五个链接只是为了踢。那里有更多的东西。它归结为几个因素 - 您需要运行的代码的类型,您的性能期望是什么,以及您愿意投入多少资金来挤出最大的收益。如果您认为Dalvik是您的瓶颈,您就能够编写本机C / C ++并在Android中使用JNI。
答案 1 :(得分:4)
您无法以这种方式比较性能。您的应用程序将在具有不同性能特征的不同硬件上运行。与硬件的影响相比,java / objective c之间的性能差异很可能是微不足道的。您应该分析应用程序的瓶颈并检查目标硬件是否可以支持它。如果它在java中实现并不重要。
答案 2 :(得分:2)
作为测试我曾经写过一个测试应用程序,它在一个大的随机列表上执行排序算法。
C版本的运行速度比同一Java版本快10倍。
我怀疑您通常会看到Java的运行速度比同一平台上的等效C慢5倍。
它运行的平台也会影响当然的速度。
答案 3 :(得分:1)
即使你不应该关心它,是的,Java字节码可能会稍慢。如果您完全担心性能,那么您可以使用NDK,并用C(++)编写大部分应用程序。
答案 4 :(得分:1)
决定是否移植到另一个平台通常来自业务方面,而不是工程方面。至于速度 - 这取决于。同时JIT往往非常快,它使用 运行时的一些优化,C编译程序无法使用。
尽管如此,我们无法预测在不知道你的程序运作的情况下移植会带来什么样的性能损失或优势。
可以选择使用从Android应用程序访问的本机C代码 - 它的性能取决于硬件并且可以预测。
答案 5 :(得分:1)
Android Java并不像您想象的那样完全解释。事实上,Java字节码甚至没有进入设备,因为dalvik VM(android的JVM)不解释它运行的DEX字节码的Java字节码更接近本机处理器格式。因此,基于知道一个是Java而一个是本机代码,很难“猜测”或推断Objective-C和Android之间的性能差异。更不用说你也有他们的OS进行比较:Linux变体与Mach内核。然后,Android不会以与iOS相同的方式将程序映射到进程。鉴于语言,操作系统,系统映射以及底层SDK代码的变化存在差异,如果您遇到性能问题,如果没有做一些工作,您实际上无法做出决定。但是,这真的不应该重要,因为如果Android上的程序需求和需求,市场力量应该比性能问题更具吸引力。你知道一句老话:“如果这对你真的很重要,你会找到办法。如果没有,你会找借口。”