Ihre Frage basiert auf vielen fehlerhaften Annahmen. Lassen Sie mich versuchen, sie aufzuklären:
Sie sagten "JVM (Dalvik VM)". Das ist wie "Flugzeug (Fahrrad)" zu sagen. Diese beiden Dinge haben absolut nichts miteinander zu tun.
Sie sagten "... was im Grunde ein virtueller Prozessor ist". Einfach falsch. Es ist nicht der Fall, dass jedes Mal, wenn die Wörter "virtuelle Maschine" oder Abkürzung "VM" in einem technischen Kontext verwendet werden, dies im Wesentlichen der von VMware Workstation entspricht . Dies liegt daran, dass Produkte wie VMware tatsächlich einen gesamten Computer und nicht nur die CPU emulieren und ein Betriebssystem auf einem anderen Betriebssystem ausführen. Dalvik VM funktioniert nicht so. Nicht einmal annähernd.
Java ist nur eine Programmiersprache. Es ist die Syntax. Android / Dalvik-Programme verwenden die gleiche 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 fast genauso schnell ist wie C-Code, da beide Programmiersprachen auf hoher Ebene sind. Der Teufel ist in den Details der Implementierung der Bibliotheksaufrufe und der Art und Weise, wie die Laufzeitumgebung entworfen wird, was sehr wenig mit der Syntax der Sprache zu tun hat.
Es ist eine übermäßige Verallgemeinerung zu sagen, dass Dalvik VM, die Java-Hotspot-JVM von Sun oder die Syntax der Java-Programmiersprache für den hohen Stromverbrauch verantwortlich ist. Der Grund ist, dass Sie alles, was Sie sprechen, mit der Leistung von etwas anderem vergleichen muss . Im allgemeinen Fall, wenn Sie nur die "Best-Case" -Funktionen beider Plattformen vergleichen, ist es grundsätzlich möglich, Dalvik-Apps genauso schnell oder schneller zu erstellen wie Programme auf einer anderen Plattform. Abgesehen von der automatischen Speicherverwaltung und der JIT-Kompilierung - Funktionen, die heutzutage in fast allen Programmierumgebungen Standard sind, einschließlich iOS und in JavaScript / HTML5 -, unterscheidet sich Dalvik kaum von Objective-C, .NET, Ruby und dem Oracle Hotspot-JVM, Python usw.
Die Wahrnehmung, dass "Java ist langsam" ist auf ein Problem mit alten Java-Versionen zurückzuführen, da diese entweder keinen Just-In-Time-Compiler (JIT) hatten oder die JIT, die sie hatten, in ihrer Funktionalität sehr eingeschränkt war. Die JVM hatte eine Just-In-Time-Compilerschon sehr lange. Ein JIT-Compiler ist ein Teil der Laufzeitumgebung (z. B. die JVM), der einen prozessorunabhängigen Bytecode (z. B. Java-Bytecode) verwendet und in native Anweisungen für die CPU kompiliert. Dieser Vorgang wird ausgeführt, wenn das Java-Programm gestartet wird. Erweiterte JIT-Compiler können einzelne Funktionen oder Anweisungen zur Laufzeit optimieren, um ihre Leistung basierend auf den beobachteten Ergebnissen zu verbessern. Wenn zum Beispiel eine Methode bei jedem Aufruf true zurückgibt, aber aus dem ursprünglichen Bytecode nicht ersichtlich ist, kann der JIT-Compiler erkennen, dass sie nur true zurückgibt, und den Funktionsaufruf durch einen harten Code ersetzen. codierter Wert von "true". Dies ist nur ein Beispiel.
JIT-Kompilierung und dynamische Codeanalyseverfahren zur Laufzeit haben in den letzten Jahren große Fortschritte gemacht. Viele in der Informatik Gemeinschaft glauben, dass in einem anderen Jahrzehnt oder zwei, die anspruchsvolle Analyse in dynamisch interpretiert / kompilierten Sprachen verfügbar, wie Java, C # und Ruby, wird so weit fortgeschritten sein, dass in den meisten Fällen, wird ausgeführt, diese Sprachen schneller auf Laufzeit als statisch kompilierte Sprachen wie C und C ++. Dies liegt daran, dass statische Compiler normalerweise nur zur Kompilierung von Code beschränkt sind und der Code zur Laufzeit nicht geändert wird. Aber in einer Laufzeitumgebung, in der der Code des Programms erneut geschrieben werden kann kannWährend der Ausführung für eine effizientere Ausführung ist ein enormes Aufwärtspotenzial zu erreichen, indem die Leistung des Codes analysiert und Anpassungen vorgenommen werden, um die Komplexität des Codes oder die Anzahl der Anweisungen zu reduzieren, die in der CPU ausgeführt werden. Bei häufig aufgerufenem Code wird der Zeitaufwand für die Durchführung der Analyse durch die Leistungsvorteile eines wiederholten Aufrufs von schnellerem Code bei weitem aufgewogen.
Es ist zu beachten, dass die Android Dalvik-VM auch eine JIT enthält und nicht das gleiche Bytecode-Format wie die Sun / Oracle-JVM verwendet. Die JIT von Dalvik ist für Umgebungen mit wenig Arbeitsspeicher optimiert und hinsichtlich der Verbesserung der Laufzeitleistung sehr weit fortgeschritten. Es ist also ein Zufall, dass JVM und Dalvik ähnliche Optimierungen für ihre jeweilige Java-basierte Laufzeitumgebung implementieren. Unter dem Dach sind sie jedoch ziemlich unterschiedlich.
Vergiss nicht, dass Dalvik selbst; der Linux-Kernel; Low-Level-Systemprozesse; Der Kern von Android-Webbrowsern (sowohl Firefox als auch Chrome) ist in nativem C / C ++ geschrieben. Daher haben sie keine Bedenken, die ein Dalvik-Programm hätte. Dies ist das gleiche wie bei iOS. Wenn es sich um reines Android handelt und nicht um das Aufblähen von Trägern / Drittanbietern, das darauf sitzt, wird ein großer Teil dessen, was Android-Kern umfasst, nicht mit Dalvik geschrieben.
Anwendungsentwickler auf Android können nach eigenem Ermessen nativen Code schreiben und dabei Dalvik umgehen. Wenn ein Anwendungsentwickler der Meinung war, dass Dalvik einen Engpass bei der Leistung seines Codes darstellt oder dazu führt, dass der Akku zu viel entladen wird, könnte er einfach C / C ++ - oder sogar Assembler-Code schreiben, wenn er möchte, ohne die Zustimmung von Google zu erhalten zu tun und ihre app so zu verteilen.
Hier sind einige tatsächlichen Gründe, warum ein Android batteriebetriebenes Gerät oder jede Vorrichtung, Probleme mit der Lebensdauer der Batterie haben kann:
Anwendungen, die die CPU, den Bildschirm oder die Datenverbindung wach halten. Insbesondere 4G-Chipsätze wie LTE verbrauchen beim Einschalten viel Energie. Wenn Sie also Hintergrundprogramme haben, die den LTE-Chip ständig aufwecken, um ein paar Kilobytes an Daten zu übertragen, führt dies zu einer schnellen Entladung der Batterie. Der Bildschirm moderner Smartphones und Tablets ist außerdem sehr energieintensiv, wenn Sie die Helligkeit nicht auf ein Minimum reduzieren.
"Bloatware", die sich auf dem Gerät befinden muss und nicht deinstalliert werden kann. Bei einigen skrupellosen Betreibern müssen Sie Bloatware ausführen, die CPU-Zyklen beansprucht und die Datenverbindung aktiviert hält. Dies kann entweder auf die Inkompetenz der Softwareentwickler der Bloatware zurückzuführen sein oder das absichtliche Ziel, Ihre Aktivitäten auf Ihrem Smartphone zu überwachen und für das Data Mining an einen Remote-Server zu senden, was für Ihre Batterie sehr energieintensiv ist.
Schließlich stimme ich Ihrer Einschätzung nicht zu, dass Android schlechtere Akkulaufzeiten als auf anderen mobilen Plattformen hat. Bestimmte Telefone und Geräte können tatsächlich Probleme mit der Lebensdauer der Batterie haben, entweder aufgrund der Kapazität der Batterie im Verhältnis zum Energieverbrauch der Hardware. schlecht optimierte Leistungseinstellungen (vom Benutzer, vom Spediteur oder vom Hersteller gewählt); oder Bloatware-Apps, die Chips ständig im Weckzustand halten. Aber für jedes Beispiel eines Geräts, das Batterieprobleme hat, kann ich Ihnen ein Gegenbeispiel eines Geräts mit ausgezeichneter Akkulaufzeit geben. Es gibt keinen einfachen Weg, um zu verallgemeinern, dass es "Dalvik" oder "Linux" oder "Java" ist. Die Energieoptimierung ist ein kompliziertes Hardware- / Software-Problem konkurrierender Anliegen, einschließlich Leistung, Reaktionsfähigkeit, und die Erwartungen der Benutzer an die Akkulaufzeit, mit Vor- und Nachteilen bei jeder Wahl. Um das Leistungsprofil eines Geräts vollständig zu verstehen, müssen Sie den Akku selbst, die gesamte Hardware und die auf dem Gerät ausgeführte Software genau unter die Lupe nehmen.