Android-Apps werden eher interpretiert als kompiliert. Sind sie dadurch zur Laufzeit langsamer als iOS-Apps?
Android-Apps werden eher interpretiert als kompiliert. Sind sie dadurch zur Laufzeit langsamer als iOS-Apps?
Antworten:
Java wird unter Android nicht interpretiert. Android-Apps werden vom Entwickler zu Bytecode kompiliert . Bytecode ist eine kompakte Darstellung des Programms: kleiner als der vom Programmierer geschriebene Quellcode, aber immer noch nicht direkt von der CPU ausführbar. In dieser Phase können einige Optimierungen vorgenommen werden, z. B. das Entfernen von totem Code.
Wenn Sie die App auf ein Gerät laden, kompiliert die Dalvik-JVM den Bytecode zu nativem ausführbarem Code, gerade als sie ausgeführt werden soll. Dies ist eine Just-in-Time- Zusammenstellung. Dies führt zu einer kurzen Verzögerung, während das Programm auf die Kompilierung wartet. Danach entsteht jedoch kein Performance-Overhead, da der Code in nativen ausführbaren Code kompiliert wurde.
Diese Vorgehensweise bietet einige Leistungsvorteile, anstatt sie direkt auf dem Computer des Entwicklers zu kompilieren. Die App kann für die jeweilige CPU des Telefons kompiliert werden, wobei die Hardwarefunktionen und die Leistungsmerkmale genutzt werden. Beispielsweise kann es Hardware-Gleitkommaoperationen verwenden, wenn die CPU dies unterstützt. Darüber hinaus kann ein cleverer JIT-Compiler (zugegebenermaßen Dalvik ist nicht ganz so clever) die Programmausführung überwachen und Optimierungen basierend auf der Art und Weise durchführen, in der das Programm im tatsächlichen Gebrauch verwendet wird. Möglicherweise wird der Code mit einem besseren Verzweigungshinweis neu kompiliert, sobald festgestellt wurde, welche Optionen in Ihrer Umgebung auf Ihrem Telefon aktiviert und deaktiviert sind. Ein Upfront-Compiler verfügt nicht über diese Informationen.
Dalvik verwendet den Dalvik-Cache und andere Techniken, um die Nachteile der JIT-Kompilierung abzumildern. Die neue JVM für Android L und höher, ART, ersetzt die JIT vollständig durch einen vorzeitigen Compiler. Dadurch wird der Bytecode bei der Installation der App zu nativem ausführbarem Code kompiliert, um die meisten Vorteile von JIT ohne Verzögerung beim Laden der App zu nutzen.
Vergessen Sie nicht, dass Android-Apps nicht ausschließlich aus Java bestehen. Entwickler haben das NDK , um alle oder einen Teil ihrer Apps in C oder C ++ zu schreiben, für leistungskritische Teile der App, insbesondere für Spiele. Spezielle Schnittstellen wie OpenGL und Renderscript ermöglichen es Programmierern, spezielle Hardware wie die GPU und den SIMD-Coprozessor für einige Arten von Berechnungen zu nutzen.
Es gibt also keine einfache Antwort auf Ihre Frage. Durch die Verwendung von JIT anstelle von Upfront-Compilierungen werden einige Dinge schneller, andere langsamer. Dies ist nur ein Teil der Gesamtleistung des Betriebssystems.
Da dies eine umfassende Frage ist, finden Sie hier eine umfassende Antwort.
"Sind iOS-Apps schneller als Android-Apps, da Android-Apps interpretiert werden?"
Erstens sind iOS-Apps nicht "schneller als" Android-Apps.
Zweitens zum Thema "Android-Apps werden interpretiert." Dies ist etwas, was Sie über das Rechnen sagen würden, wie "vor 15 Jahren": Wie Sie aus der obigen Diskussion sehen können, ist die Situation heute viel komplizierter; Es sind völlig neue Technologien in den Vordergrund getreten. Das Konzept "kompiliert ist schneller als interpretiert!" war vor 20 Jahren ein relevanter Vergleich von Perl mit Maschinencode; Die Dinge haben sich so sehr weiterentwickelt, dass das Problem bei "iOS V Android" heutzutage nicht wirklich eindeutig angewendet werden kann.
Drittens gibt es andere Probleme bei der mobilen Programmierung, die solche Überlegungen völlig überdecken. Nur ein Beispiel vor Ort: Mobile Programmierer haben es satt, große Bildlauflisten, verzögertes Laden und ähnliche Probleme zu lösen. Wie die beiden Betriebssysteme und die verschiedenen gängigen Bibliotheken mit diesen kritischen Problemen umgehen, überflutet häufig andere Probleme.
Viertens sind die Probleme mit dem Grafikchipsatz und die verschiedenen komplizierten Beziehungen zwischen Software, OpenGL usw. ein weiteres überwältigendes Problem bei Mobiltelefonen. Zum Beispiel hat Apple ein System herausgebracht, das in Bezug auf diese Probleme als "Metal" bezeichnet wird, und Android hat ein eigenes "Ding" auf diesem Gebiet herausgebracht. Diese Probleme rund um die Grafik-Pipeline sind enorm wichtig, damit sich Apps in Ihrer Hand "anfühlen".
Die sehr kurze Antwort auf Ihre Frage lautet "kompiliert V. interpretiert". Ist dies im Grunde ein veralteter Diskussionspunkt, den Sie kennen?
(Außerdem finde ich ein Note3 nicht besonders "langsamer" als ein iPhone. Außerdem ist ein Teil davon ein reines Artefakt - es gibt kostengünstige Android-Telefone: Es werden einfach keine iPhones mit niedriger Leistung hergestellt, sodass manche Leute möglicherweise falsche haben Ideen daraus.)
Weil interpretierte Apps nicht bedeuten, dass sie immer langsam sind. Manchmal sind sie mächtiger und dynamischer als kompilierte. Da alle Codes in der kompilierten App einmal kompiliert werden und die Ausgabe in Form von Bibliotheken oder ausführbaren Dateien gespeichert wird, kann einmal in der interpretierten Sprache die Ausführungsreihenfolge nach dem Zufallsprinzip geändert werden. Ich kann also sagen, es hängt von Entwickler zu Entwickler und von der Art der Programmierung ab.
Java (die Programmiersprache von Android) wird jedoch nicht interpretiert, sondern JIT kompiliert. Das bedeutet, dass Android-Programme erst kompiliert werden, bevor Sie sie ausführen. Dadurch wird eine Leistung erzielt, die der von iOS Objective C ziemlich ähnlich ist.
In jüngerer Zeit kompiliert das ART-Framework von Android die Apps vor, sodass sie genauso ausgeführt werden wie iOS-Apps. Mit anderen Worten, die nächste Version von Android wird vermutlich genauso schnell sein wie iOS.
Aktualisieren
Programmiersprachen fallen im Allgemeinen in eine von zwei Kategorien: Kompiliert oder interpretiert. Bei einer kompilierten Sprache wird der eingegebene Code auf eine Reihe von maschinenspezifischen Anweisungen reduziert, bevor er als ausführbare Datei gespeichert wird. Bei interpretierten Sprachen wird der Code in dem von Ihnen eingegebenen Format gespeichert. Kompilierte Programme werden im Allgemeinen schneller ausgeführt als interpretierte, da interpretierte Programme zur Laufzeit auf Maschinenanweisungen reduziert werden müssen. Mit einer interpretierten Sprache können Sie jedoch Dinge tun, die in einer kompilierten Sprache nicht möglich sind. Beispielsweise können sich interpretierte Programme ändern, indem sie zur Laufzeit Funktionen hinzufügen oder ändern. In der Regel ist es auch einfacher, Anwendungen in einer interpretierten Umgebung zu entwickeln, da Sie Ihre Anwendung nicht jedes Mal neu kompilieren müssen, wenn Sie einen kleinen Abschnitt testen möchten.