Le app iOS sono più veloci delle app Android poiché le app Android vengono interpretate?


31

Le app Android vengono interpretate anziché compilate. Questo li rende più lenti delle app iOS in fase di runtime?


14
E ' non è una buona domanda, perché le applicazioni Android non sono interpretati, così come la corretta risposta in realtà sottolinea.
Aaronaught,

2
Normalmente la risposta accettata non è la migliore risposta non è un grosso problema, poiché l'obiettivo è aiutare chi ha posto la domanda (vedi questo meta post). Ma questo è un caso piuttosto estremo @ArmonSafai La risposta che hai selezionato come corretta è piena di disinformazione e ha superato il punto di essere recuperabile con le modifiche. Ti preghiamo di considerare di selezionare un'altra risposta.
Selali Adobor,

Si noti che al giorno d'oggi alcune grandi aziende - inclusa IBM - stanno scrivendo le principali applicazioni in Java. Dato un compilatore Just-In-Time (JIT), che è una parte standard di una moderna VM Java, le prestazioni sono davvero paragonabili a qualsiasi altro linguaggio di alto livello. Java non è stato solo "un linguaggio interpretato" per molti anni.
Keshlam,

I compilatori JIT non sono affatto legati al concetto di JVM. Ci sono JVM che non usano compilatori JIT, anche commerciali. Alcune varianti di JVM di IBM non abilitano JIT per impostazione predefinita, invece passano automaticamente alla compilazione AOT. Inoltre, una piccola nota, "le principali applicazioni in Java in questi giorni" era probabilmente un po 'più adatto un decennio e mezzo fa (IBM stava aggiungendo a Java prima del 1997)
Selali Adobor,

La domanda è alquanto fuorviante. Un'app iOS "nativa" è scritta in Objective-C (o Swift) e compilata, mentre un'app Android "standard" è scritta in Java e compilata in bytecode. Vedi la risposta di @ DanHulme. Ma è possibile scrivere app per entrambe le piattaforme in HTML e JavaScript utilizzando ad esempio PhoneGap / Cordova. Un'app HTML viene generalmente percepita come più lenta di un'app nativa sulla stessa piattaforma. Quindi, se un'app simile per la "altra" piattaforma sembra più lenta forse è perché è stata creata usando una tecnologia diversa.
David,

Risposte:


85

Java non è interpretato su Android. Le app Android vengono compilate in bytecode dallo sviluppatore. Bytecode è una rappresentazione compatta del programma: più piccola del codice sorgente scritto dal programmatore, ma non ancora eseguibile direttamente dalla CPU. In questa fase è possibile apportare alcune ottimizzazioni, come la rimozione del codice morto.

Quando carichi l'app su un dispositivo, Dalvik JVM compila il bytecode in codice eseguibile nativo, proprio mentre sta per essere eseguito. Questa è una compilazione just-in-time . Provoca un breve rallentamento mentre il programma attende di essere compilato, ma in seguito non vi è alcun sovraccarico di prestazioni, poiché il codice è stato compilato in codice eseguibile nativo.

Ci sono alcuni vantaggi prestazionali nel farlo in questo modo invece di compilare in anticipo sul computer dello sviluppatore. L'app può essere compilata per la CPU specifica sul telefono, sfruttando le sue funzionalità hardware e utilizzando le sue caratteristiche prestazionali. Ad esempio, può utilizzare operazioni hardware in virgola mobile se la CPU lo supporta. Inoltre, un compilatore JIT intelligente (è vero, Dalvik non è così intelligente) può monitorare il modo in cui il programma viene eseguito ed eseguire ottimizzazioni in base al modo in cui il programma viene utilizzato nell'uso reale. Potrebbe ricompilare il codice con un migliore suggerimento di diramazione una volta che ha visto quali opzioni sono attivate e disattivate nel proprio ambiente, sul telefono. Un compilatore iniziale non ha queste informazioni da usare.

Dalvik utilizza la cache Dalvik e altre tecniche per mitigare gli svantaggi della compilazione JIT. La nuova JVM per Android L e successive, ART, sostituisce interamente la JIT con un compilatore in anticipo . Questo compila il bytecode in codice eseguibile nativo quando l'app è installata, per ottenere la maggior parte dei vantaggi di JIT senza il ritardo nel caricamento dell'app.

Non dimenticare che le app Android non sono interamente composte da Java. Gli sviluppatori hanno l' NDK per scrivere tutte o parte delle loro app in C o C ++, per le parti critiche delle prestazioni dell'app, in particolare per i giochi. Interfacce speciali come OpenGL e Renderscript consentono ai programmatori di sfruttare hardware speciale come la GPU e il coprocessore SIMD per alcuni tipi di calcolo.

Quindi davvero, non c'è una risposta semplice alla tua domanda. L'uso di JIT invece della compilazione anticipata rende alcune cose più veloci, altre più lente. È solo una parte delle prestazioni complessive del sistema operativo.


1
+1 per una grande spiegazione. In realtà stavo aspettando una risposta come questa.
MANI,

5
Non molto diverso dal vecchio stanco dibattito "Prestazioni .NET / Java vs. C ++" su PC, davvero. Sono mele e arance.
Aaronaught,

1
@ArmonSafai Proprio così.
Dan Hulme,

2
@MTilsted: è un po ' vero, ma memorizza quasi tutto nella cache, quindi ciò di cui stai parlando avverrebbe probabilmente solo la prima volta che avvii un'app.
Aaronaught,

1
Il problema principale qui è che Dalvik è considerato come una JVM "normale". Tra l'essere basato sul registro, al contrario dello stack basato come HotSpot (a causa della natura dei processori ARM rispetto a quelli che HotSpot stava prendendo di mira [come IA32]), è l'uso di Zygote e il concetto di file odex (ovvero l'idea di non [più o meno] passando direttamente dal file di classe al caricatore di classi), il trattamento di Dalvik come una normale JVM porta a delle idee sbagliate. Soprattutto perché molti dei dettagli dell'implementazione di HotSpot sono spesso erroneamente associati alle JVM in generale (come se fosse il compilatore JIT).
Selali Adobor,

2

Poiché questa è una domanda ampia, ecco una risposta ampia.

"Le app iOS sono più veloci delle app Android poiché le app Android vengono interpretate?"

Innanzitutto le app iOS non sono "più veloci" delle app Android.

In secondo luogo, per quanto riguarda il problema "Le app Android vengono interpretate". Questo è qualcosa che diresti sull'informatica, come "15 anni fa": come puoi vedere dalla discussione sopra, la situazione oggi è molto più complicata; tecnologie completamente nuove sono venute alla ribalta. Il concetto "compilato è più veloce di quello interpretato!" era pertinente confrontando, sai, perl con il codice macchina 20 anni fa; le cose sono andate avanti così tanto che il problema non può essere realmente applicato chiaramente a "iOS V Android" oggi.

In terzo luogo, ci sono altri problemi nella programmazione mobile che sommergono totalmente tali considerazioni. Solo un esempio sul campo, i programmatori di telefonia mobile si sbarazzano della gestione di grandi elenchi scorrevoli di immagini, caricamento lento e problemi simili. Il modo in cui i due sistemi operativi e le varie librerie popolari gestiscono questi problemi critici spesso sommerge altri problemi.

In quarto luogo, solo un altro problema travolgente sui cellulari è il problema del chipset grafico e le varie relazioni complicate di ciò con il software, OpenGL e così via. Ad esempio, Apple sta uscendo con un sistema che chiamano "Metal" in relazione a questi problemi e Android sta uscendo con il proprio "oggetto" in questo campo. Questi problemi intorno alla pipeline grafica sono estremamente importanti per il modo in cui le app "sentono" nelle tue mani.

La risposta molto breve alla tua domanda è "compilata V. interpretata" è fondamentalmente un punto di discussione obsoleto che conosci?

(Inoltre, non trovo in particolare un Note3 "più lento" di un iPhone. Inoltre, alcuni di questi sono artefatti puri: esistono telefoni Android economici: semplicemente non sono realizzati iPhone a basso rendimento, quindi alcune persone potrebbero non avere idee da questo.)


-3

Perché le app interpretate non significano che sono sempre lente. A volte sono più potenti e dinamici rispetto a quello compilato. Poiché tutti i codici nell'app compilata vengono compilati una volta e l'output viene mantenuto in forma di librerie o eseguibili, mentre in linguaggio interpretato, una volta è possibile modificare in modo casuale la sequenza di esecuzione. Quindi posso dire che dipende dallo sviluppatore allo sviluppatore e dal modo di programmare.

Tuttavia, Java (il linguaggio di programmazione di Android) non viene interpretato ma viene compilato JIT. Ciò significa che i programmi Android vengono compilati appena prima di eseguirli, offrendo prestazioni ragionevolmente simili all'obiettivo iOS di iOS.

Più recentemente, il framework ART di Android precompila le app, quindi vengono eseguite allo stesso modo delle app iOS. In altre parole, la prossima versione di Android sarà presumibilmente veloce quanto iOS.

Aggiornare

I linguaggi di programmazione generalmente rientrano in una delle due categorie: compilata o interpretata. Con una lingua compilata, il codice inserito viene ridotto a un set di istruzioni specifiche della macchina prima di essere salvato come file eseguibile. Con le lingue interpretate, il codice viene salvato nello stesso formato inserito. I programmi compilati generalmente funzionano più velocemente di quelli interpretati perché i programmi interpretati devono essere ridotti alle istruzioni della macchina in fase di esecuzione. Tuttavia, con un linguaggio interpretato puoi fare cose che non possono essere fatte in un linguaggio compilato. Ad esempio, i programmi interpretati possono modificarsi aggiungendo o modificando le funzioni in fase di esecuzione. Di solito è anche più semplice sviluppare applicazioni in un ambiente interpretato perché non è necessario ricompilare l'applicazione ogni volta che si desidera testare una piccola sezione.


1
cosa vuoi dire "una volta può cambiare in modo casuale la sequenza di esecuzione? E come sono più potenti e dinamici? Inoltre, non
sto

3
Questo non è del tutto vero. È fuorviante affermare che non dover ricompilare è un vantaggio, poiché è ancora necessario creare un file APK e distribuirlo sul dispositivo di prova. Google non ha deciso di utilizzare Java: Android era già basato su Java prima che Google lo acquistasse. I file APK non contengono il codice "nello stesso formato immesso da [il programmatore]".
Dan Hulme,

1
Microsoft .NET viene compilato in codice IL, che viene anche interpretato come java in codice byte.
Esben Skov Pedersen,

12
Molte informazioni in questa risposta non sono realmente rilevanti o tecnicamente corrette. Onestamente suggerirei che questa risposta venga totalmente rivista per la precisione tecnica.
Aza,

2
Java non è generalmente un linguaggio interpretato , a meno che non si abbia a che fare con un'implementazione JVM insolita. La compilazione JIT non è la stessa cosa di un interprete, quindi la maggior parte di questa risposta è onestamente piuttosto irrilevante nel contesto delle prestazioni di Android poiché utilizza JIT.
eldarerathis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.