Android应用是被解释而不是被编译。这会使它们在运行时比iOS应用慢吗?
Android应用是被解释而不是被编译。这会使它们在运行时比iOS应用慢吗?
Answers:
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而不是前期编译会使某些事情变得更快,某些事情变得更慢。这只是操作系统整体性能的一部分。
由于这是一个广泛的问题,所以这里有一个广泛的答案。
“因为解释了android应用程序,iOS应用程序是否比android应用程序更快?”
首先,iOS应用程序不比Android应用程序“更快”。
其次,关于“ Android应用程序已解释”的问题。这就是您要说的关于计算的东西,例如“ 15年前”:从上面的讨论中可以看出,今天的情况要复杂得多;全新的技术脱颖而出。“编译比解释要快!”这一概念。您知道,将perl与20年前的机器代码进行比较是有意义的;事情发展得如此之快,以至于现在还不能真正将其应用于“ iOS V Android”。
第三,移动编程中还有其他问题完全淹没了这些考虑。仅是一个例子,移动程序员在处理图像的大型滚动列表,延迟加载以及类似问题时大吃一惊。两种操作系统以及各种流行的库如何处理这些关键问题,常常会淹没其他问题。
第四,在手机上,另一个令人头疼的问题是图形芯片组及其与软件,OpenGL等的各种复杂关系。例如,苹果公司推出了针对这些问题的“金属”系统,而安卓系统公司在这一领域也推出了自己的“东西”。图形流水线中的这些问题对于您的应用如何“感觉”极为重要。
您的问题的简短回答是“编译的V.解释的”,基本上是您知道的过时讨论点吗?
(此外,我并没有发现Note3比iPhone更“慢”。而且,其中有些是纯人工制品-确实存在廉价的Android手机:根本不是制造低性能的iPhone,所以有些人可能不正确的想法。)
因为解释型应用程序并不意味着它们总是很慢。有时它们比已编译的代码更强大,更动态。由于已编译应用程序中的所有代码均会被编译一次,并且输出将以库或可执行文件的形式保存,而在使用插补语言时,一次可以随机更改执行顺序。所以我可以说,这取决于开发人员与开发人员之间以及那里的编程方式。
但是,不会解释Java(Android的编程语言),而是通过JIT进行编译。这意味着Android程序会在运行之前进行编译,从而提供与iOS的Objective C相当相似的性能。
最近,Android的ART框架预编译了应用程序,因此它们的运行方式与iOS应用程序相同。换句话说,Android的下一个版本可能与iOS一样快。
更新资料
编程语言通常分为两类之一:编译或解释。使用已编译的语言,您输入的代码在保存为可执行文件之前,将简化为一组机器特定的指令。使用解释性语言,代码将以您输入的相同格式保存。编译程序通常比解释程序运行得更快,因为在运行时必须将解释程序简化为机器指令。但是,使用解释性语言,您可以执行编译语言无法完成的工作。例如,解释程序可以通过在运行时添加或更改函数来修改自身。通常,在解释环境中开发应用程序也更容易,因为您不必每次都要测试一小部分时都需要重新编译应用程序。