Da Android-Anwendungen auf einer JVM (Dalvik VM) ausgeführt werden, die im Grunde genommen ein virtueller Prozessor ist, und jeder virtuelle Befehl dem nativen Befehl des zugrunde liegenden Chipsatzes zugeordnet werden muss, führt diese Zuordnung aufgrund des Overheads dieser Zuordnung zu einem höheren Stromverbrauch?
Diese Frage kann auf Java ausgeweitet und auch als "Verbrauchen Java-Anwendungen mehr Leistung?" Ist dies der Grund, warum Android-Handys im Vergleich zu anderen Plattformen / Handys eine so entsetzliche Akkulaufzeit haben?
Edit : Basierend auf den Antworten habe ich ein paar Punkte geklärt, weil ich fälschlicherweise austauschbar von JVM und Dalvik gesprochen hatte. In diesem Abschnitt spreche ich nur von Java, um zu fragen, ob es mehr Energie verbraucht, und wenn ja, trifft dies konzeptionell auch auf Android zu und führt zu einer verringerten Akkulaufzeit.
Kontext : aus Wikipedia zitiert:
- Java-Bytecode entspricht der Assemblersprache für C-Code.
- Aus Sicht eines Compilers ist die Java Virtual Machine nur ein weiterer Prozessor mit einem Befehlssatz, Java-Bytecode, für den Code generiert werden kann.
- JVM verfügt über eine Stapelarchitektur. Dalvik ist eine virtuelle Prozessmaschine, die nicht die gleiche Art der Virtualisierung wie JVM aufweist und eine Registerarchitektur aufweist.
Da die Java-Programmiersprache zu Bytecode kompiliert wird (Assembler-ähnlich) und auf einem virtuellen Prozessor ausgeführt wird, bietet sie echte Software-Code-Portabilität. Da es eine JVM für Linux gibt und Linux auf offene Hardware portiert wurde, kann die Kombination eine echte Anwendungsportabilität über den gesamten Stack bieten.
Leistung : Die Frage besteht im Wesentlichen darin, wie viel Prozent Ihrer CPU-Taktzyklen für dieselbe Funktionalität Ihres Software-Codes oder Ihrer Anwendung auf die Laufzeitumgebung zurückzuführen sind. Dies gilt für die Just-In-Time-Kompilierungsumgebung moderner JVMs. Wenn der Bytecode mit dem nativen Befehl des zugrunde liegenden Chipsatzes kompiliert wird, sollte die Laufzeit nur während der JIT-Kompilierung aktiv sein. Wie viel mehr CPU-Taktzyklen werden in der Laufzeitumgebung verbraucht, was zu einem höheren Stromverbrauch führen dürfte? Ich interessiere mich nur für den Stromverbrauch und nicht für die relative Leistung im Vergleich zu statisch typisierten und gebauten Sprachen und verstehe die Vorteile von Java. Unterfragen, die im Zusammenhang stehen könnten:
- Verwendet die Java-Laufzeit die libc für ihre Funktionalität?
- Wird einer dieser Punkte im Zusammenhang mit dem Stromverbrauch auf die Dalvik VM und Android übertragen?
- Anstatt den schlechten Batterieverbrauch von Android zu verallgemeinern, ohne über den Bildschirm und die drahtlosen Chipsätze zu sprechen, lassen Sie uns darüber sprechen, wie das iPhone 5 einen 1440-mAh-Akku hat, der im Vergleich zu modernen Nexus-Handys winzig ist. Dieser ganze Gedankengang (Java, virtueller Prozessor, Anweisungszuordnung, Android) entstand, weil ein iphone-loyalistischer Freund behauptete, dies könnte der wahrscheinliche Grund dafür sein, dass sein iphone eine bessere Akkulaufzeit hat als mein (großartiger) Nexus.
Auf jeden Fall danke für die Antworten unten.
Antworten:
Ihre Frage basiert auf vielen fehlerhaften Annahmen. Lassen Sie mich versuchen, sie aufzuklären:
Sie sagten "JVM (Dalvik VM)". Das ist, als würde man "Flugzeug (Fahrrad)" sagen. Diese beiden Dinge haben absolut nichts miteinander zu tun.
Sie sagten "... das ist im Grunde ein virtueller Prozessor". Einfach falsch. Es ist nicht so , dass jedes Mal, wenn die Wörter "Virtual Machine" oder das Akronym "VM" in einem technischen Kontext verwendet werden, dies im Wesentlichen VMware Workstation entspricht . Dies liegt daran, dass Produkte wie VMware tatsächlich einen gesamten Computer emulieren, nicht nur die CPU, und ein Betriebssystem auf einem anderen Betriebssystem ausführen. Dalvik VM funktioniert so nicht . Nicht einmal annähernd.
Java ist nur eine Programmiersprache. Es ist die Syntax. Android / Dalvik-Programme verwenden zufällig dieselbe oder eine sehr ähnliche Syntax wie eine völlig unabhängige Desktop / Server-Programmiersprache namens Java, die auf einer Java Virtual Machine ausgeführt wird. Theoretisch könnten Sie Java-Code schreiben, der nahezu der Geschwindigkeit von C-Code entspricht, da beide Programmiersprachen auf hohem Niveau sind. Der Teufel liegt in den Details der Implementierung der Bibliotheksaufrufe und der Art und Weise, wie die Laufzeit gestaltet ist, was sehr wenig mit der Syntax der Sprache zu tun hat.
Es ist übertrieben zu verallgemeinern, dass Dalvik VM, die Sun Java Hotspot JVM oder die Syntax der Java-Programmiersprache für einen hohen Stromverbrauch verantwortlich sind. Der Grund ist, dass Sie vergleichen müssen, wovon Sie sprechen, mit der Leistung von etwas anderem . Im Allgemeinen ist es beim Vergleich der "Best-Case" -Funktionen beider Plattformen im Prinzip möglich, Dalvik-Apps zu erstellen, die genauso schnell oder schneller sind als Programme auf anderen Plattformen. Abgesehen von der automatischen Speicherverwaltung und JIT-Kompilierung - Funktionen, die heutzutage in fast allen Programmierumgebungen, einschließlich iOS und JavaScript / HTML5, Standard sind - unterscheidet Dalvik nur sehr wenig von Objective-C, .NET, Ruby, dem Oracle Hotspot JVM, Python usw.
Die Annahme, dass "Java langsam ist", ist auf ein Problem mit alten Java-Versionen zurückzuführen, da sie entweder keinen Just-In-Time-Compiler (JIT) hatten oder die Funktionalität des JIT stark eingeschränkt war. Die JVM hat einen Just-In-Time-Compilerschon sehr lange. Ein JIT-Compiler ist Teil der Laufzeit (z. B. der JVM), die prozessorunabhängigen Bytecode - z. B. Java-Bytecode - verwendet und in native Anweisungen für die CPU übersetzt. Dieser Vorgang wird ausgeführt, wenn das Java-Programm gestartet wird. Fortgeschrittene JIT-Compiler können einzelne Funktionen oder Anweisungen zur Laufzeit optimieren, um ihre Leistung basierend auf den beobachteten Ergebnissen zu verbessern. Wenn beispielsweise eine Methode bei jedem Aufruf true zurückgibt, dies jedoch aus dem ursprünglichen Bytecode nicht hervorgeht, kann der JIT-Compiler erkennen, dass sie nur true zurückgibt, und den Funktionsaufruf durch einen hard- codierter Wert von "true". Dies ist nur ein Beispiel.
JIT-Kompilierung und dynamische Code-Analyse zur Laufzeit haben in den letzten Jahren enorme Fortschritte gemacht. Viele in der Informatik Gemeinschaft glauben , dass in den nächsten zehn Jahren oder zwei, zur Verfügung die anspruchsvolle Analyse in dynamisch interpretiert / kompilierten Sprachen wie Java, C # und Ruby, werden so weit fortgeschritten , dass in den meisten Fällen werden diese Sprachen ausführen schneller auf Laufzeit als statisch kompilierte Sprachen wie C und C ++. Dies liegt daran, dass statische Compiler in der Regel auf das Kompilieren von Code zum Zeitpunkt der Erstellung beschränkt sind und der Code zur Laufzeit nicht geändert wird. Aber in einer Laufzeitumgebung, in der sich der Code des Programms selbst neu schreiben kannWährend der Ausführung, um effizienter zu arbeiten, kann eine enorme Steigerung erzielt werden, indem die Leistung des Codes analysiert und Anpassungen vorgenommen werden, um die Komplexität des Codes oder die Anzahl der auf der CPU ausgeführten Anweisungen zu verringern. Bei häufig aufgerufenem Code wird der Zeitaufwand für die Durchführung der Analyse bei weitem durch die Leistungsvorteile eines wiederholten Aufrufs von schnellerem Code aufgewogen.
Es ist zu beachten, dass die Android Dalvik-VM auch eine JIT enthält und nicht dasselbe Bytecode-Format wie die Sun / Oracle-JVM verwendet. Dalviks JIT ist für Umgebungen mit wenig Arbeitsspeicher optimiert und hinsichtlich der Laufzeitverbesserungen sehr weit fortgeschritten. Es ist also ein Zufall, dass JVM und Dalvik ähnliche Optimierungen für ihre jeweilige Java-basierte Laufzeitumgebung implementieren , aber unter der Haube sind sie ziemlich unterschiedlich.
Vergiss nicht, dass Dalvik selbst; der Linux-Kernel; Low-Level-Systemprozesse; und der Kern der Android-Webbrowser (sowohl Firefox als auch Chrome) ist in nativem C / C ++ geschrieben, sodass sie keine der allgemeinen Probleme haben, die ein Dalvik-Programm verursachen würde. Dies ist das gleiche wie bei iOS. Wenn es sich um reines Android handelt und nicht um das Aufblähen von Netzbetreibern oder Drittanbietern, das darauf sitzt, wird ein sehr großer Teil dessen, was das Kern-Android ausmacht, nicht mit Dalvik geschrieben.
Anwendungsentwickler auf Android können optional auch systemeigenen Code schreiben und Dalvik umgehen. Wenn ein Anwendungsentwickler der Meinung war, dass Dalvik einen Engpass bei der Leistung seines Codes darstellt oder dafür sorgt, dass zu viel Batterie verbraucht wird, könnte er einfach C / C ++ oder sogar Assembler-Code schreiben, wenn er dies wünscht, ohne die Zustimmung von Google einzuholen zu tun, und verteilen ihre App so.
Im Folgenden sind einige tatsächliche Gründe aufgeführt, aus denen ein batteriebetriebenes Android-Gerät oder ein anderes Gerät Probleme mit der Batterielebensdauer haben kann:
Anwendungen, die die CPU, den Bildschirm oder die Datenverbindung wach halten. Insbesondere 4G-Chipsätze wie LTE verbrauchen viel Energie, wenn sie eingeschaltet sind. Wenn Sie also Hintergrundprogramme haben, die den LTE-Chip kontinuierlich aktivieren, um einige Kilobyte Daten zu übertragen, wird der Akku sehr schnell entladen. Der Bildschirm moderner Smartphones und Tablets ist auch sehr energieintensiv, sofern Sie die Helligkeit nicht auf ein Minimum reduzieren.
"Bloatware", das auf dem Gerät installiert sein muss und nicht deinstalliert werden kann. Bei einigen skrupellosen Anbietern müssen Sie Bloatware ausführen, die CPU-Zyklen in Anspruch nimmt und die Datenverbindung aufrecht erhält. Dies kann entweder auf eine Inkompetenz der Software-Entwickler der Bloatware zurückzuführen sein oder auf das absichtliche Ziel, Ihre Aktivitäten auf Ihrem Smartphone zu überwachen und sie zum Data Mining an einen Remote-Server zu senden, was für Ihren Akku sehr energieintensiv ist.
Schließlich stimme ich Ihrer Einschätzung nicht zu, dass Android schlechtere Probleme mit der Akkulaufzeit hat als andere mobile Plattformen. Bestimmte Telefone und Geräte können tatsächlich Probleme mit der Akkulaufzeit haben, entweder aufgrund der Kapazität des Akkus im Verhältnis zum Energieverbrauch der Hardware. schlecht optimierte Leistungseinstellungen (vom Benutzer, vom Netzbetreiber oder vom Hersteller gewählt); oder Bloatware-Apps, die das Telefon immer wach halten. Aber für jedes Beispiel eines Geräts mit Batterieproblemen kann ich Ihnen ein Gegenbeispiel eines Geräts mit hervorragender Batterielebensdauer geben. Es gibt keinen einfachen Weg, um zu verallgemeinern, dass "es ist Dalvik" oder "es ist Linux" oder "es ist Java". Energieoptimierung ist eine komplizierte Mischung aus Hard- und Software und konkurrierenden Aspekten wie Leistung, Reaktionsfähigkeit, und die Erwartungen der Benutzer an die Batterielebensdauer, mit Vor- und Nachteilen für jede Wahl. Um das Energieprofil eines Geräts vollständig zu verstehen, müssen Sie sich den Akku selbst, die gesamte Hardware und die gesamte auf dem Gerät ausgeführte Software genau ansehen.
quelle
In dieser Antwort werde ich die Leistung mit Android und IOS vergleichen, da die beiden über 80% des Marktanteils einnehmen.
Java-Apps verbrauchen keinen Strom mehr. ( http://www.javarants.com/2004/05/04/looks-like-apple-should-switch/ ) Die Java-VM von Oracle oder in Wirklichkeit die Dalvik-VM von Google wird als wesentlich effizienter angesehen als die Objective-C von IOS. Java ist in der Lage, Code zu optimieren, bevor er auf dem Telefon ausgeführt wird, was zu einer viel besseren Leistung führen könnte. Java-Bibliotheken sind Open Source und wurden daher von Hunderten verschiedener Entwickler optimiert. Auf der anderen Seite können mit IOS nur Apple-Entwickler den Code ändern. Weniger Überprüfung = weniger potenzielle Leistung.
Android-Programme können auch nativen C-Code ausführen, der möglicherweise schneller als Object-C ist (die einzige von IOS unterstützte Sprache).
Der Grund, warum sich Google für die Verwendung der Dalvik VM entschieden hat, liegt in der Portabilität. Ich kenne vier verschiedene CPU-Architekturen, auf denen Android offiziell laufen kann (ARM, MIPS, x86, I.MX). Während jedes andere Telefon-Betriebssystem nur ein (ARM) verwenden kann. ( http://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems ) Es ist also unfair, verschiedene CPU-Typen mit beispielsweise IPhone zu vergleichen. Wenn Android auf dem IPhone laufen würde, wäre Android vergleichbar mit überlegener Leistung und Akkulaufzeit.
"Verbrauchen Java-Anwendungen mehr Energie?" Einfach nein.
Warum haben Android-Handys im Vergleich zu anderen Plattformen / Handys so entsetzliche Akkulaufzeiten? Viele Android-Handys sind billiger als Apples IPhone gebaut, aber schauen Sie sich den Preisunterschied an. Das iPhone kostet mehr wegen des viel größeren Akkus (und es ist im Durchschnitt langsamer CPU). Mein Android-Handy (Google Galaxy Nexus) hat eine vergleichbare Akkulaufzeit wie das iPhone 4G, verfügt jedoch über viel schnellere Hardwarespezifikationen (1 GHz gegenüber 1,2 GHz).
BEARBEITEN: Java kann Code ohne das Wissen des Programmierers optimieren. Perfekt, C-Code läuft immer schneller als Java / Objective-C / C #. Das heißt, wie viele Programmierer gibt es perfekt? Auf der JVM-Ebene werden Java und Bibliotheken aufgrund ihrer Open-Source-Entwicklungsprinzipien immer "perfekter" sein. ( http://www.infoq.com/news/2012/03/Defects-Open-Source-Commercial )
EDIT 2: Ein kleiner Vorgeschmack auf Informationen: Lenovos neues Android-Telefon P780 - 42 Stunden Gesprächszeit im Vergleich zu 12 Stunden auf dem iPhone.
quelle
Ja, es hängt mit einem erhöhten Stromverbrauch zusammen - Abstraktionsebenen werden dies tun. Es führt auch zu einer Verringerung der Geschwindigkeit (gegenüber der gleichen Münze - wenn etwas mehr Overhead hat, dauert die Ausführung länger und benötigt somit mehr CPU). Wenn ich das richtig verstehe, ist das einer der Vorteile der NDK-Funktion - Ermöglichen Sie Beschleunigungen für bestimmte Prozessoren, indem Sie bestimmten Code schreiben.
Bei den meisten Jobs wird der mit dem Betrieb einer VM verbundene "Stromverbrauch" jedoch durch andere Faktoren in den Hintergrund gedrängt. Bei den meisten Programmen verbraucht die Verwendung von Bildschirm und Funkgeräten den größten Teil des Stroms.
quelle
In Bezug auf alle anderen Poster glaube ich, dass es hier nicht darauf ankommt, ob C / C ++ / Java vorhanden ist, sondern was die Anwendungen tun.
Da der Stromverbrauch direkt mit der Verarbeitung zusammenhängt, würde ich mich fragen, welche Verarbeitung ein Programm machen würde.
Angenommen, Sie fügen Zahlen hinzu. Angenommen, Sie addieren 2 mit 2 in einer Endlosschleife, bis Sie 2.000.000 erreichen. Es stellen sich zwei Fragen:
Diese beiden Fragen definieren letztendlich, wie viele Operationen der Prozessor ausführen muss und wie viel Strom ein Gerät letztendlich verbraucht. Abgesehen davon ist der "Aufwand" für die Ausführung einer virtualisierten Umgebung möglicherweise vernachlässigbar, da das gesamte Programm zuvor von Java optimiert wurde. Dies hängt jedoch auch davon ab, was die Anwendung ausführt.
quelle
Ja.
Virtuelle Maschinen erledigen alles zweimal und nicht unbedingt effizient. Sie verbrauchen also mindestens doppelt so viel Strom, um dieselben Anweisungen wie eine "echte Maschine" zu verarbeiten. Das Vorhandensein einer virtuellen Maschine verlangsamt die Arbeit und verbraucht mehr Energie. Grundsätzlich erledigen Betriebssysteme wie iOS und Windows alles schneller und mit weniger Stromverbrauch.
Dies führt zu echten Unterschieden bei Bildschirmübergängen, beim Laden von Seiten, bei der Navigation usw. Gegenwärtig vergleiche ich Android (VM) und Windows Phone und selbst mit einem langsameren Prozessor (1 GHz vs. 1,6 GHz) übertrifft Windows Android bei der Ausführung der gleichen Aufgaben erheblich.
Was jedoch die Aufmerksamkeit der meisten Menschen auf sich zieht, ist die Tatsache, dass sie eine App installieren und der Akku plötzlich schneller leer ist. Das liegt nicht wirklich an der virtuellen Maschine, sondern an einer App, die ressourcenhungrig ist.
Der ganze Grund für ein Betriebssystem für virtuelle Maschinen, die Portabilität, ist kein guter Grund, ein Betriebssystem darauf aufzubauen. Sehen Sie Leute, die Telefone mit ihrer Lieblingsarchitektur kaufen und Android verwenden, weil es portabel ist? Sehen Sie Menschen, die auf eine höhere Leistung und Zuverlässigkeit verzichten und Android auf ihre Nicht-Android-Handys schalten? Die Leute kaufen ein Android-Telefon oder ein Windows-Telefon oder ein IPhone usw. Es ist unpraktisch, die Leistung für die Portabilität von kostengünstigen Geräten zu opfern. Es war eine gute Idee, die zum Scheitern verurteilt wurde.
quelle