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

评论

这不是一个好问题,因为未正确解释Android应用程序,正如正确答案所指出的那样。

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

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

JIT编译器与JVM的概念完全无关。有些JVM不使用JIT编译器,甚至不使用商业编译器。 IBM JVM的某些变体默认情况下不启用JIT,而是默认为AOT编译。另外,请注意,“近些年来Java中的主要应用程序”可能更适合十年半以前(IBM在1997年之前加入Java)

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

#1 楼

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很好的解释。我实际上正在等待这样的答案。

– MANI
2014年9月21日下午13:16

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

– Aaronaught
2014-09-21 18:33

@ArmonSafai相当。

–丹·赫尔姆
2014年9月21日在22:27

@MTilsted:的确如此,但是它几乎可以缓存所有内容,因此您所谈论的内容可能只会在您第一次运行应用程序时发生。

– Aaronaught
2014年9月21日23:32

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

–塞拉利·阿多伯(Selali Adob​​or)
2014年9月22日下午17:00

#2 楼

既然这是一个广泛的问题,那么这是一个广泛的答案。

“由于解释了android应用程序,iOS应用程序的运行速度比android应用程序快吗?”

首个iOS应用程序不是“

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

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

第四,在移动设备上还有一个压倒性的问题是图形芯片组问题和各种复杂关系。软件,OpenGL等。例如,苹果公司推出了针对这些问题的“ Metal”系统,而Android则推出了自己的“ thingy”系统。图形管道中的这些问题对于应用程序如何“掌握”非常重要。

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

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

#3 楼

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

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

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

Update

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

评论


您是什么意思?“一旦可以随机改变执行顺序?它们如何变得更强大,更动态?还不是说它们变慢,只是它们变慢,甚至稍微变慢。

– Armon Safai
2014年9月21日在8:26



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

–丹·赫尔姆
2014年9月21日11:00

Microsoft .NET被编译为IL代码,该代码也被解释为与Java被编译为字节码一样。

– Esben Skov Pedersen
2014年9月21日在12:39

此答案中的许多信息确实不相关或技术上正确。老实说,我建议对这个答案进行彻底修改以提高技术准确性。

–user73777
2014年9月21日在17:07

除非您要处理不寻常的JVM实现,否则Java通常不是解释型语言。 JIT编译与解释器不是同一回事,因此,实际上,大多数答案与Android性能无关,因为它使用JIT。

–eldarerathis
2014-09-21 17:52