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.
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.