解释了android应用程序后,iOS应用程序是否比android应用程序快?


31

Android应用是被解释而不是被编译。这会使它们在运行时比iOS应用慢吗?


14
不是一个好问题,因为解释Android应用,正如正确答案实际上指出的那样。
亚罗诺(Aaronaught)2014年

2
通常,公认的答案不是最佳答案并不是什么大问题,因为目标是帮助提出问题的人(请参阅 meta post)。但这是一个非常极端的情况@ArmonSafai您选择为正确的答案充满了错误信息,已经超出了可以通过编辑进行挽救的地步。请考虑选择其他答案。
Selali Adob​​or 2014年

请注意,最近一些大型公司(包括IBM)正在用Java编写大型应用程序。给定即时(JIT)编译器,它是现代Java VM的标准部分,其性能确实可以与任何其他高级语言相媲美。多年以来,Java不仅是“一种解释语言”。
keshlam 2014年

JIT编译器与JVM的概念完全无关。有些JVM不使用JIT编译器,甚至不使用商业编译器。IBM JVM的某些变体默认情况下不启用JIT,而是默认为AOT编译。另外,请注意,“
近些年

这个问题有些令人误解。“本机” iOS应用程序是用Objective-C(或Swift)编写的,并且进行了编译,而“标准” Android应用程序是用Java编写的,并编译为字节码。参见@DanHulme的答案。但是可以使用诸如PhoneGap / Cordova的HTML和JavaScript为这两种平台编写应用程序。通常认为HTML应用程序比同一平台上的本机应用程序运行更慢。因此,如果用于“其他”平台的类似应用看上去较慢,则可能是因为它是使用不同的技术创建的。
大卫

Answers:


85

Java在Android上没有解释。Android应用程序由开发人员编译为字节码。字节码是程序的紧凑表示形式:小于程序员编写的源代码,但仍不能直接由CPU执行。在此阶段可以进行一些优化,例如删除无效代码。

当您将应用程序加载到设备上时,Dalvik JVM将字节码编译为本地可执行代码,就像即将运行时一样。这是即时编译。在程序等待编译时,这会导致短暂的速度降低,但是此后没有性能开销,因为该代码已被编译为本机可执行代码。

以这种方式执行而不是在开发人员的计算机上进行预先编译,具有一些性能优势。该应用程序可以利用其硬件功能并利用其性能特征,针对手机上的特定CPU进行编译。例如,如果CPU支持,它可以使用硬件浮点运算。此外,一个聪明的JIT编译器(诚然,Dalvik并不是那么聪明)可以监视程序的运行方式,并根据实际使用该程序的方式执行优化。一旦在您的手机上看到了在环境中打开和关闭的选项,它可能会使用更好的分支提示来重新编译代码。前期编译器没有这些信息要使用。

Dalvik使用Dalvik缓存和其他技术来减轻JIT编译的缺点。适用于Android L及更高版本的新JVM ART完全用预先编译器代替了JIT 。安装应用程序时,这会将字节码编译为本机可执行代码,以获得JIT的大多数优势,而不会延迟加载应用程序。

不要忘记,Android应用程序并不完全由Java组成。开发人员可以使用NDK来用C或C ++编写其全部或部分应用程序,以用于性能至关重要的部分,尤其是游戏。诸如OpenGL和Renderscript之类的专用接口使程序员可以利用诸如GPU和SIMD协处理器之类的特殊硬件来进行某种类型的计算。

因此,确实,您的问题没有简单的答案。使用JIT而不是前期编译会使某些事情变得更快,某些事情变得更慢。这只是操作系统整体性能的一部分。


1
+1很好的解释。我实际上正在等待这样的答案。
MANI 2014年

5
确实,这与PC上陈旧的“ .NET / Java与C ++性能”争论并没有太大不同。是苹果和橘子。
Aaronaught

1
@ArmonSafai相当。
丹·赫尔姆

2
@MTilsted:这是一种真实的,但它几乎缓存应有尽有,让你在说什么关于可能仅会发生在运行应用程序的第一次。
Aaronaught

1
这里的主要问题是Dalvik被当作“普通” JVM。在基于寄存器的基础上,而不是像HotSpot之类的基于堆栈的基础上(由于ARM处理器的特性与针对那些HotSpot的本质(例如IA32)相对),它使用了Zygote,以及odex文件的概念(即而不是(或多或少)直接从类文件转到​​类加载器),将Dalvik视为普通的JVM必然会导致一些误解。尤其是由于HotSpot实现的许多细节通常通常与JVM错误地关联(例如JIT编译器)。
Selali Adob​​or 2014年

2

由于这是一个广泛的问题,所以这里有一个广泛的答案。

“因为解释了android应用程序,iOS应用程序是否比android应用程序更快?”

首先,iOS应用程序不比Android应用程序“更快”。

其次,关于“ Android应用程序已解释”的问题。这就是您要说的关于计算的东西,例如“ 15年前”:从上面的讨论中可以看出,今天的情况要复杂得多;全新的技术脱颖而出。“编译比解释要快!”这一概念。您知道,将perl与20年前的机器代码进行比较是有意义的;事情发展得如此之快,以至于现在还不能真正将其应用于“ iOS V Android”。

第三,移动编程中还有其他问题完全淹没了这些考虑。仅是一个例子,移动程序员在处理图像的大型滚动列表,延迟加载以及类似问题时大吃一惊。两种操作系统以及各种流行的库如何处理这些关键问题,常常会淹没其他问题。

第四,在手机上,另一个令人头疼的问题是图形芯片组及其与软件,OpenGL等的各种复杂关系。例如,苹果公司推出了针对这些问题的“金属”系统,而安卓系统公司在这一领域也推出了自己的“东西”。图形流水线中的这些问题对于您的应用如何“感觉”极为重要。

您的问题的简短回答是“编译的V.解释的”,基本上是您知道的过时讨论点吗?

(此外,我并没有发现Note3比iPhone更“慢”。而且,其中有些是纯人工制品-确实存在廉价的Android手机:根本不是制造低性能的iPhone,所以有些人可能不正确的想法。)


-3

因为解释型应用程序并不意味着它们总是很慢。有时它们比已编译的代码更强大,更动态。由于已编译应用程序中的所有代码均会被编译一次,并且输出将以库或可执行文件的形式保存,而在使用插补语言时,一次可以随机更改执行顺序。所以我可以说,这取决于开发人员与开发人员之间以及那里的编程方式。

但是,不会解释Java(Android的编程语言),而是通过JIT进行编译。这意味着Android程序会在运行之前进行编译,从而提供与iOS的Objective C相当相似的性能。

最近,Android的ART框架预编译了应用程序,因此它们的运行方式与iOS应用程序相同。换句话说,Android的下一个版本可能与iOS一样快。

更新资料

编程语言通常分为两类之一:编译或解释。使用已编译的语言,您输入的代码在保存为可执行文件之前,将简化为一组机器特定的指令。使用解释性语言,代码将以您输入的相同格式保存。编译程序通常比解释程序运行得更快,因为在运行时必须将解释程序简化为机器指令。但是,使用解释性语言,您可以执行编译语言无法完成的工作。例如,解释程序可以通过在运行时添加或更改函数来修改自身。通常,在解释环境中开发应用程序也更容易,因为您不必每次都要测试一小部分时都需要重新编译应用程序。


1
您是什么意思?“一旦可以随机改变执行顺序?它们如何更强大和更动态?还不是要说它们变慢,只是它们变慢甚至略微。”
Armon Safai2014年

3
这并非完全正确。说不必重新编译是一个优势,这是一种误导,因为您仍然需要构建APK文件并将其部署到测试设备。Google并未决定使用Java:Android在Google购买Java之前就已经基于Java。APK文件不包含“与[程序员]输入的格式相同的代码”。
Dan Hulme 2014年

1
Microsoft .NET被编译为IL代码,该代码也被解释为与java被编译为字节码一样。
Esben Skov Pedersen 2014年

12
此答案中的许多信息确实不相关或在技术上都是正确的。老实说,我建议完全修改此答案以提高技术准确性。
阿扎

2
Java通常不是解释性语言,除非您要处理不寻常的JVM实现。JIT编译与解释器不是同一回事,因此,实际上,大多数答案与Android性能无关,因为它使用JIT。
eldarerathis 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.