由于Android或Java在虚拟机上运行,​​它会使用更多功能吗?


14

由于Android应用程序在基本上是虚拟处理器的JVM(Dalvik VM)上运行,并且每个虚拟指令都必须映射到底层芯片组的本机指令,因此由于这种映射的开销,这种映射是否会导致更多的功耗?

这个问题可以扩展到Java,也可以表述为“ Java应用程序使用更多功率吗?”。这就是为什么Android手机比其他平台/手机具有如此惊人的电池续航能力的原因吗?

编辑:根据答案,我已经澄清了几点,因为我错误地互换了JVM和Dalvik的意见。在本文中,我只是在谈论Java,以询问它是否使用了更多功率,如果可以,在概念上是否也适用于Android,并且会导致电池寿命缩短。

上下文:引自维基百科:

  1. Java字节码类似于C代码的汇编语言。
  2. 从编译器的角度来看,Java虚拟机只是具有指令集Java字节码的另一个处理器,可以为其生成代码。
  3. JVM具有堆栈体系结构。Dalvik是一个过程虚拟机,它与JVM的虚拟化类型不同,并具有寄存器体系结构。

由于Java编程语言被编译为字节码(类似于程序集)并且在虚拟处理器上运行,因此它提供了真正的软件代码可移植性。另外,由于存在用于Linux的JVM,并且Linux已移植到开放硬件上,因此这种组合可以在整个堆栈上提供真正的应用程序可移植性。

力量:问题本质上可以归结为这一点-对于您的软件代码或应用程序的相同功能集,您的CPU时钟周期的百分比归因于运行时环境。这是在现代JVM的即时编译环境中进行的,在该环境中,如果将字节码编译为基础芯片组的本机指令,则运行时应仅在jit编译期间处于活动状态。因此,在具有运行时环境的情况下,要用掉多少CPU时钟周期,这预计会导致功耗开销。我只对功耗方面感兴趣,而不对与静态类型化和内置语言相比的相对性能感兴趣,并且了解Java的优势。可能与之相关的子问题:

  • Java运行时是否使用libc来实现其功能?
  • 这些功耗相关点中的任何一个都转换为Dalvik VM和Android吗?
  • 除了讨论屏幕和无线芯片组而不是概括Android电池消耗低的情况外,我们不妨讨论一下iPhone 5的1440 mAH电池与现代Nexus手机相比是多么小。整个思路(Java,虚拟处理器,指令映射,Android)之所以出现,是因为一位iPhone忠实的朋友声称这可能是其iPhone的电池续航时间比我(令人敬畏的)联系更长的电池寿命的原因。

无论如何,感谢您的以下回答。


1
请勿按mAh来比较电池。这是当前的;从理论上讲,您可以拥有2 mAh电池,其功率(瓦特小时)要比具有10000000 mAh的电池更大。取决于电压。Nexus 4具有8 Wh电池,而iPhone 5具有5.45 Wh电池。差异主要归因于屏幕尺寸:Nexus 4具有4.7英寸对角线显示屏,而iPhone 5具有4英寸显示屏,具有更高的分辨率和更高的亮度(608 cd / m ^ 2 vs. 500)。也有明显的不同:Nexus 4在1.5 GHz时具有四核; iPhone 5在1.3 GHz时具有双核。更快=消耗更多电池
allquixotic 2013年

1
基本上,iPhone的使用寿命更长,而且电池更小,因为整个平台设计得更小:更小的物理空间,更小的屏幕,更小的CPU,更少的内核,更少的功能,更少的性能,更少,更少,更少。Android手机一直在朝着相反的方向发展:更大,更多的内核,更大的功能和更快的速度。当然,他们将需要更大的电池才能获得相同的电池寿命。有时,即使是大电池也无法适当补偿电量消耗,在这种情况下,您的手机电池寿命会很短。
allquixotic

Answers:


25

您的问题基于许多错误的假设。让我尝试清除它们:

  • 您说“ JVM(Dalvik VM)”。这就像在说“飞机(自行车)”。这两件事绝对是无关的。

  • 您说“ ...基本上是虚拟处理器”。简直是假的。这是不是说,每个词“虚拟机”或缩写“VM”在技术方面被使用时,它实质上等同于案件的VMware Workstation。这是因为像VMware 这样的产品实际上不仅可以模拟整个计算机,而且还可以模拟整个计算机,并且可以在另一个操作系统之上运行一个操作系统。Dalvik VM不能那样工作。差远了。

  • Java只是一种编程语言。这是语法。Android / Dalvik程序恰好使用与完全不相关的称为Java的桌面/服务器编程语言相同或非常相似的语法,该语言在Java虚拟机上运行。从理论上讲,您可以编写与C代码几乎相同的Java代码,因为它们都是高级编程语言。恶魔在于实现库调用的细节以及运行时的设计方式,这与语言的语法几乎没有关系。

  • 过于笼统地说Dalvik VM,Sun Java Hotspot JVM或Java编程语言语法是造成高功耗的原因。原因是您必须将正在谈论的内容与其他内容的性能进行比较。在最一般的情况下,当您仅比较两个平台的“最佳情况”功能时,原则上可以使Dalvik应用程序与其他平台上的程序一样快或更快。除了自动内存管理和JIT编译(这是当今几乎所有编程环境(包括iOS和JavaScript / HTML5)中的标准功能)之外,Dalvik与Objective-C,.NET,Ruby, Oracle Hotspot JVM,Python等。

  • 之所以认为“ Java缓慢”,是由于Java的旧版本存在问题,因为它们要么没有即时编译器(JIT),要么它们的功能非常有限。JVM有一个即时编译器现在已经很长时间了。JIT编译器是运行时(例如JVM)的一部分,该运行时采用与处理器无关的字节码(例如Java字节码)并将其编译为CPU的本机指令。该过程在Java程序启动时完成,高级JIT编译器可以在运行时优化单个函数或指令,以根据观察到的结果提高其性能。例如,如果某个方法每次被调用都返回true,但是从原始字节码中看不到它会这样做,则JIT编译器可以识别出它只是返回true,然后用一个编码值为“ true”。这只是一个例子。

  • 近年来,JIT编译和运行时动态代码分析技术取得了长足的进步。计算机科学界的许多人认为,再过一两年,动态解释/编译语言(例如Java,C#和Ruby)中提供的复杂分析将变得如此先进,以至于在大多数情况下,这些语言将以更快的速度执行。运行时要比静态编译的语言(如C和C ++)好。这是因为静态编译器通常仅限于在构建时编译代码,而在运行时不会修改代码。但是在运行时环境中,程序的代码可以自行重写在执行过程中,为了更有效地执行,通过分析代码的性能并进行调整以减少代码的复杂性或CPU上运行的指令数量,可以实现巨大的增长空间。对于经常调用的代码,执行重复分析所需的时间投入远远超过了重复调用更快的代码所带来的性能优势。

  • 应该注意的是,Android Dalvik VM还包含一个JIT,并且它不使用与Sun / Oracle JVM相同的字节码格式。Dalvik的JIT针对低内存环境进行了优化,就运行时性能增强而言非常先进。因此,JVM和Dalvik 对它们各自基于Java的运行时环境实现类似的优化有点巧合,但是在本质上它们却截然不同。

  • 不要忘记达尔维克本身。Linux内核;低级系统流程;并且Android网络浏览器(Firefox和Chrome)的核心都是用本机C / C ++编写的,因此它们没有Dalvik程序会产生的开销方面的任何担忧。这与iOS相同。如果您是在谈论纯Android,而不是位于其之上的运营商/第三方膨胀,那么构成核心Android的很大一部分都不是使用Dalvik编写的。

  • Android上的应用程序开发人员还可以选择绕过Dalvik来编写本机代码。如果应用程序开发人员认为Dalvik成为其代码性能的瓶颈,或导致其消耗过多电量,那么他们可以选择编写C / C ++甚至汇编代码,而无需获得Google的批准为此,并像这样分发他们的应用。

这是Android电池供电的设备或任何设备可能会出现电池寿命问题的一些实际原因:

  • 使CPU,屏幕或数据连接保持唤醒状态的应用程序。特别是,诸如LTE之类的4G芯片组在开机时会消耗大量能量,因此,如果您有不断唤醒LTE芯片以传输几千字节数据的后台程序,则会非常耗电。除非您将亮度调到最小,否则现代智能手机和平板电脑上的屏幕也非常耗能。

  • 设备上必须安装的“膨胀软件”,无法将其卸载。一些不道德的运营商要求您运行过时的软件,这会占用CPU周期并使数据连接保持唤醒状态。这可能是由于过时软件的软件开发人员的能力不足,或者是故意的目标,即监视智能手机上的活动并将其发送到远程服务器进行数据挖掘,这对于电池来说是非常耗能的。

最后,我不同意您的评估,即与其他移动平台相比,Android的电池寿命问题更严重。某些电话和设备的确可能存在电池寿命问题,这可能是由于电池的容量相对于硬件的能耗所致;优化的电源设置不佳(由用户,运营商或制造商选择);或使手机中的芯片一直处于唤醒状态的过时软件应用程序。但是,对于每个出现电池问题的设备的示例,我都可以举一个具有出色电池寿命的设备作为反例。没有简单的方法可以概括“这是Dalvik”或“这是Linux”或“这是Java”。功耗优化是一种复杂的硬件/软件混杂在一起的竞争问题,包括性能,响应能力,以及用户对电池寿命的期望,每种选择都有其优缺点。要完全了解设备的电源配置文件,您必须仔细查看电池本身,所有硬件以及设备上运行的所有软件。


1
+1这是一点点tl; dr,但它具有全部功能,甚至是一个很好的技术答案。
Doktoro Reichard

谢谢,所有的公平点。我错误地互换了一些术语,因为我在问一些我不知道的问题。如果您仍然有兴趣,请对问题本身进行一些修改。
PKM 2013年

这个答案很有参考价值,但距离问题很远。问题的核心是VM开销是否会使用更多的CPU时间,然后通过采用的优化来节省它。尽管这个问题在其他方面也暗示了这一点,但这更多地说明了为什么Android比iO更好。
IgorČordaš2014年

这里也有一个错误的假设。IOS确实缺少Mac OS的自动内存管理。正是这种管理使Dalvik成为所有典型问题的“ Java”。几个月前,关于Dalvik的垃圾回收(GC)问题,有了一个很好的概述:anandtech.com/show/8231/…-如果它们也影响电池寿命,或者仅仅是性能我无法确定。
pvblivs 2014-09-22

@pvblivs虽然为iOS编写“高级”应用程序代码确实使用了自动引用计数而不是GC,而Dalvik使用GC和“因此”(我并不是说这一定是正确的,只是因为您似乎在争论)这一点,它至少可信)的iOS是“更有效”比Android ......你还是那种想念我点的那Android应用不具备的Java编写,实际上可以用汇编语言编写或如果需要,甚至可以包含本机ARM代码!对性能极为敏感的应用程序和内置内容使用不带GC的本机代码。
allquixotic

5

在这个答案中,我将比较Android和IOS的性能,因为两者占据了80%以上的市场份额。

Java应用程序不消耗更多功率。(http://www.javarants.com/2004/05/04/looks-like-apple-should-switch/)Oracle的Java VM或实际上Google的Dalvik VM被认为比IOS的Objective-C效率更高。Java能够在手机上执行代码之前对其进行优化,这可能会带来更好的性能。Java库是开源的,因此已经被数百个不同的开发人员进行了优化。另一方面,只有iOS开发人员才能使用IOS更改代码。更少的评论=更少的潜在表现。

Android程序还能够运行本机C代码,这可能比Object-C(IOS支持的唯一语言)更快。

Google决定使用Dalvik VM的原因是出于可移植性。我知道Android可以正式运行的四种不同CPU架构(ARM,MIPS,x86,I.MX)。而其他所有电话操作系统只能使用一个(ARM)。(http://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems)因此比较不同的CPU类型与例如iPhone是不公平的。如果在iPhone上运行Android,则Android的性能和电池寿命可与之媲美。

“ Java应用程序使用更多功率吗?” 根本没有。
与其他平台/手机相比,为什么Android手机的电池寿命如此惊人? 许多Android手机的制造价格都比Apple IPhone便宜,但要看价格差异。iPhone的成本较高,因为其中装有更大的电池(并且平均来说CPU速度较慢)。我的Android手机(Google Galaxy Nexus)的电池寿命可与IPhone 4G媲美,但硬件规格要快得多(1GHz对1.2GHZ)。

编辑:Java可以优化代码,而无需程序员的知识。完美的是,C代码始终会比Java / Objective-C / C#运行得更快;也就是说,有多少程序员是完美的?在JVM级别,由于Java和库的开放源代码开发原则,它们将总是“更加完善”。(http://www.infoq.com/news/2012/03/Defects-Open-Source-Commercial

编辑2:信息的小知识:联想的新P780 Android手机-42小时的通话,而iPhone则为12小时。


1
我认为这个问题本身是完全没有事实根据的,例如“ ...与其他平台/手机相比,Android手机的电池寿命如此惊人”。根本不是真的。
allquixotic

还要补充一点,您的第一个链接是质量可疑的恕我直言:基准文件不见了,评论者反驳了该链接发布者的意见。由于缺乏无法证明的消息来源和主观陈述,该帖子似乎带有偏见。
Doktoro Reichard

好吧,第一个评论者是对的。没有详细的测试,所有答案将是有偏见的。我确实同意Android手机的电池寿命非常糟糕,但这肯定不是很多人提到的VM造成的。
IgorČordaš14年

很快,随着Android ART运行时的到来,所有这些信息都将过时。
Mark Lopez

3

是的,这确实与功耗增加有关—抽象层可以做到这一点。这也会导致速度降低(同一枚硬币的反面-如果某些东西的开销更大,它将需要更长的时间才能执行,从而使用更多的CPU)。如果我正确理解的话,这就是NDK的优点之一-通过编写特定的代码,可以加快特定处理器的速度。

就是说,对于大多数工作,我认为运行VM的“与功率有关”的开销与其他考虑因素相比是微不足道的-对于大多数程序,使用屏幕和收音机会消耗大部分功率。


你是对的。即使在大多数情况下,如果在Oled屏幕上使用黑色界面元素,则与NDK和SDK相比,它可以节省更多的电能。
IgorČordaš14年

3

关于所有其他张贴者,我认为最重要的不是C / C ++ / Java是否存在,而是应用程序在做什么。

由于功耗直接与处理相对应,因此我会问自己程序将执行什么处理。

假设您要添加数字。假设您要在无限循环中将2加2,直到达到2.000.000。出现两个问题:

  1. 如何实现:它是for循环的吗?是while循环吗?(这是Goto / Label黑客吗?)
  2. 如何优化代码。

这两个问题最终定义了处理器需要执行的操作数量,最终定义了设备使用的功率。话虽这么说,由于Java先前对整个程序进行了优化,因此运行虚拟化环境的“开销”可以忽略不计,但是这又取决于应用程序在做什么。


0

是。

虚拟机“两次做所有事情”,并且不一定有效。因此,它们将至少使用两倍于“真实机器”的能力来处理相同的指令。虚拟机的存在会降低运行速度并消耗更多电能。基本上,像iOS和WIndows这样的操作系统将以更少的功耗更快地完成所有工作。

这转化为屏幕切换,页面加载,导航等方面的真正差异。目前,我正在比较Android(VM)和Windows Phone,甚至使用较慢的处理器(1 GHz与1.6 GHz),Windows在执行相同任务方面也明显优于Android。

但是,吸引大多数人注意的是当他们安装应用程序时,突然间他们的电池电量消耗得更快。那不是真的因为虚拟机,而是因为一个饥饿地使用资源的应用程序。

虚拟机操作系统的整体原因,可移植性并不是基于操作系统的一个很好的理由。您是否看到人们购买具有他们最喜欢的架构的电话并使用Android,因为它具有便携性?您是否看到人们放弃了更高的性能和可靠性,并将android投放到非android手机上?人们购买了Android Phone,Windows Phone或IPhone等。为降低低成本设备的可移植性而牺牲性能是不切实际的。这是个好主意,但失败了。

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.