Sind iOS-Apps schneller als Android-Apps, da Android-Apps interpretiert werden?

31

Android-Apps werden eher interpretiert als kompiliert. Sind sie dadurch zur Laufzeit langsamer als iOS-Apps?

Armon Safai
quelle
14
Dies ist keine gute Frage, da Android-Apps nicht interpretiert werden, wie die richtige Antwort tatsächlich zeigt.
Aaronaught
2
Normalerweise ist die akzeptierte Antwort, die nicht die beste Antwort ist, kein allzu großes Problem, da das Ziel darin besteht, denjenigen zu helfen, die die Frage gestellt haben (siehe diesen Meta-Beitrag). Aber das ist ein ziemlich extremer Fall @ArmonSafai Die Antwort, die Sie als richtig ausgewählt haben, ist voller Fehlinformationen und kann mit Änderungen nicht mehr gerettet werden. Bitte erwägen Sie eine andere Antwort.
Selali Adobor
Beachten Sie, dass einige große Unternehmen - einschließlich IBM - heutzutage wichtige Anwendungen in Java schreiben. Angesichts eines Just-In-Time-Compilers (JIT), der ein Standardbestandteil einer modernen Java-VM ist, ist die Leistung wirklich mit jeder anderen Hochsprache vergleichbar. Java ist seit vielen Jahren nicht nur "eine interpretierte Sprache".
Keshlam
JIT-Compiler sind überhaupt nicht an das Konzept einer JVM gebunden. Es gibt JVMs, die keine JIT-Compiler verwenden, auch keine kommerziellen. Einige Variationen von IBMs JVM aktivieren JIT nicht standardmäßig, sondern standardmäßig die AOT-Kompilierung. Außerdem war "Major Applications in Java heutzutage" wahrscheinlich vor anderthalb Jahrzehnten etwas passender (IBM hat Java vor 1997
hinzugefügt
Die Frage ist etwas irreführend. Eine "native" iOS-App wird in Objective-C (oder Swift) geschrieben und kompiliert, während eine "standardmäßige" Android-App in Java geschrieben und in Bytecode kompiliert wird. Siehe @ DanHulme's Antwort. Es ist jedoch möglich, Apps für beide Plattformen in HTML und JavaScript zu schreiben, z. B. mit PhoneGap / Cordova. Eine HTML-App wird normalerweise langsamer ausgeführt als eine native App auf derselben Plattform. Wenn eine ähnliche App für die "andere" Plattform langsamer erscheint, liegt dies möglicherweise daran, dass sie mit einer anderen Technologie erstellt wurde.
David

Antworten:

85

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.

Dan Hulme
quelle
1
+1 für eine gute Erklärung. Ich habe tatsächlich auf eine Antwort wie diese gewartet.
MANI
5
Eigentlich nicht viel anders als die müde alte Debatte ".NET / Java vs. C ++ - Leistung" auf dem PC. Es sind Äpfel und Orangen.
Aaronaught
1
@ArmonSafai Ganz so.
Dan Hulme
2
@MTilsted: Das ist Art wahr, aber es speichert fast alles, was man so reden würden Sie wahrscheinlich nur das erste Mal passiert eine App laufen.
Aaronaught
1
Das Hauptproblem hierbei ist, dass Dalvik als "normale" JVM betrachtet wird. Im Gegensatz zu HotSpot auf Stack-Basis (aufgrund der Art der ARM-Prozessoren im Vergleich zu den HotSpot-Prozessoren [wie IA32]) wird Zygote verwendet, und das Konzept der Odex-Dateien (dh die gesamte Idee von Dalvik als normale JVM zu betrachten, kann zu Missverständnissen führen. Zumal viele Details der HotSpot-Implementierung im Allgemeinen fälschlicherweise mit JVMs in Verbindung gebracht werden (wie es der JIT-Compiler ist).
Selali Adobor
2

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

Fattie
quelle
-3

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.

Siehe scharf
quelle
1
Was meinst du mit "einmal kann zufällig die Reihenfolge der Ausführung ändern? Und wie sind sie leistungsfähiger und dynamischer? Auch ich sage nicht, dass sie langsam sind, nur dass sie langsamer sind, sogar geringfügig.
Armon Safai
3
Das ist nicht ganz richtig. Es ist irreführend zu sagen, dass das Nicht-Neukompilieren ein Vorteil ist, da Sie immer noch eine APK-Datei erstellen und auf dem Testgerät bereitstellen müssen. Google hat sich nicht für Java entschieden: Android war bereits vor dem Kauf durch Google Java-basiert. APK-Dateien enthalten nicht den Code "in dem Format, das [der Programmierer] eingegeben hat".
Dan Hulme
1
Microsoft .NET wird in IL-Code kompiliert, der auch so interpretiert wird, wie Java in Bytecode kompiliert wird.
Esben Skov Pedersen
12
Viele Informationen in dieser Antwort sind wirklich nicht relevant oder technisch korrekt. Ich würde aufrichtig vorschlagen, diese Antwort aus Gründen der technischen Genauigkeit komplett zu überarbeiten.
Aza
2
Java ist im Allgemeinen keine interpretierte Sprache , es sei denn, Sie haben es mit einer ungewöhnlichen JVM-Implementierung zu tun. Die JIT-Kompilierung ist nicht dasselbe wie ein Interpreter. Daher ist der größte Teil dieser Antwort für die Leistung von Android ziemlich irrelevant, da JIT verwendet wird.
Eldarerathis