Perché "Evita enumerazioni in cui hai solo bisogno di input" è stato rimosso dai suggerimenti sulle prestazioni di Android?


175

La sezione "Evita enumerazioni in cui hai solo bisogno di input" è stata rimossa dalla documentazione ufficiale per gli sviluppatori . (Vedi Perché Android non usa più enumerazioni? Per il contenuto della vecchia sezione)

Perché? C'è stato un cambiamento nella VM Android che ha reso la punta obsoleta?


2
Per riferimento, ecco il bytecode decompilato per l'esempio di Shrubbery: https://gist.github.com/847418
Josh Lee,

15
A partire da marzo 2014, la pagina seguente contiene ancora consigli contro l'uso di enum: developer.android.com/training/articles/memory.html#Overhead
Tahir Akhtar

2
Un anno dopo, come ha affermato @TahirAkhtar, la formazione ufficiale su Android dice ancora "Dovresti assolutamente evitare di usare enum su Android".
LarsH,

1
Interessante notare la raccomandazione per evitare enum è in questo articolo del 2015 di uno sviluppatore Android leader: medium.com/google-developers/… Inoltre: "Nota che utilizzando l'annotazione @IntDef, che è supportato da Android Studio e Gradle 1.3+, garantirà la sicurezza del tuo tipo di build-time del codice (quando sono abilitati errori di lanugine), mantenendo allo stesso tempo le dimensioni e i vantaggi in termini di prestazioni dell'utilizzo delle variabili int. "
tonylo,

4
A partire da aprile 2018, la pagina seguente non contiene più consigli contro l'uso di enum. developer.android.com/topic/performance/memory#Overhead
Robin Davies

Risposte:


157

la versione originale di quel documento era solo un mucchio di pregiudizi. è stato riscritto per contenere solo fatti di cui è stato eseguito il backup da benchmark effettivi e viene aggiornato con l'aggiornamento della VM. puoi trovare i vari parametri di riferimento, oltre ad alcuni dei parametri di riferimento che utilizziamo per ottimizzare le librerie di base, su http://code.google.com/p/dalvik/ .


35
Sarebbe utile se hai elencato le tue credenziali nel tuo profilo SO. Mi ci è voluto un po 'per scavare. Ma ora che vedo che sembri lavorare nel team VM, accetterò la tua risposta come risposta ufficiale. :)
Thierry-Dimitri Roy,

25
L'aggiunta di una classe enum significa ovviamente che la tua app contiene una classe aggiuntiva, quindi non è gratuita , ma dobbiamo supporre che uno sviluppatore stia solo aggiungendo enumerazioni dove sono utili. L'unico uso veramente negativo che ho visto degli enum era in qualche codice di armonia in cui volevano davvero gli in (per maschere di bit e simili) e "enum" non era un enum in alcun senso ragionevole. Se ti ritrovi a chiamare "ordinal ()" molto, probabilmente è un cattivo odore che significa che non vuoi un enum. Ma questo non è un suggerimento specifico per Android, ed è comunque un errore di progettazione davvero raro.
Elliott Hughes,

17
Anche questo documento non è aggiornato @ Thierry-DimitriRoy? In particolare, dovresti assolutamente evitare di usare enum su Android.
Jacob Tabak,

3
FWIW, Proguard trasforma di default gli enum in ints .
Nacho Coloma,

11
Il link che hai fornito è morto.
Terry,

26

Una supposizione:

  • Le CPU Gigahertz come Hummingbird e Snapdragon sono ormai comuni e i requisiti di memoria piccola di codice ridotto che originariamente limitavano la VM Dalvik non sono più così veri.
  • Ogni dispositivo di spedizione utilizza la JIT (nuova versione 2.2). L'inizializzatore di classi dell'enum funzionerà più velocemente, i valori potrebbero essere trattati come costanti di tempo JIT e il JIT potrebbe avere un supporto speciale per la razionalizzazione delle classi di enum.
  • Il codice che è veramente sensibile alle prestazioni utilizza l'NDK, che era ancora nuovo e non lucidato quando è stato rilasciato Android 1.5. L'NDK in 2.3 supporta attività native, che consente giochi quasi completamente non gestiti.

Pertanto, per i requisiti relativamente banali di un'app GUI, i vantaggi in termini di tempi di sviluppo di enum superano di gran lunga i costi di runtime aggiuntivi.


23

Elliott Hughes offre maggiori dettagli sulla riscrittura della documentazione sul suo blog: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

La seconda metà del post spiega che ogni rivendicazione sul documento Performance è ora supportata da benchmark. Le versioni precedenti del documento apparentemente contenevano affermazioni non verificate, come "Evita le enumerazioni perché sono troppo costose".


Volevo solo integrare la risposta accettata da Elliott con questo link.
jkooker,

12

La risposta del 2011 di Elliot Hugues affermava che il motivo originale per evitare l'enumismo era per motivi di prestazioni ... come in "prestazioni di elaborazione". Poiché questo motivo non era supportato da fatti, è stato rimosso dalla documentazione ufficiale.

È stato aggiunto in seguito perché gli enum aggiungono molti più dati in memoria rispetto all'uso dell'intero.


2
Inoltre, i ragazzi di Google hanno introdotto le IntDefannotazioni, che consentono di utilizzare le costanti int in modo sicuro con gli errori e gli avvisi di Android Studio. blog.shamanland.com/2016/02/int-string-enum.html
Oleksii K.

9

TLDR: Dalvik non era bravo con l'allocazione della memoria e Enumutilizza più memoria di int. Android Lollipop ha sostituito Dalvik con ART che non presenta gli stessi limiti. Pertanto questa raccomandazione non è più pertinente.

La lunga risposta:

Wow! 8 anni, 5 risposte e molti commenti dopo il vero motivo non viene ancora affrontato.

Nei giorni pre-lollipop per Android, Dalvik era il processo utilizzato dalla VM. Dato che una piccola quantità di memoria era disponibile per le applicazioni da utilizzare durante quel periodo, Dalvik aveva molti vincoli di memoria. Per l'allocazione della memoria Dalvik ha dovuto camminare sul mucchio e trovare spazio. Anche l'heap si frammenterebbe nel tempo. Dalvik non poteva deframmentare, quindi si sarebbe allocato nel tempo e alla fine sarebbe rimasto senza spazio.

Evita le enumerazioni in cui hai solo bisogno di Ints

viene dai giorni di Dalvik perché Enumè molto più grande di un inte l'allocazione di memoria era molto costosa.

Avanti veloce oggi, Dalvik è stato sostituito da ART. ART è uscito in KitKat ed è predefinito da Lollipop.

ART è stato creato da zero non per ottimizzare la memoria ma per ottimizzare le prestazioni. È inoltre ottimizzato per allocazioni e raccolte. Il motivo è che la memoria è riservata ai grandi oggetti. Invece di mettere tutto nello stesso mucchio, e quindi dover trovare spazio per oggetti di grandi dimensioni in mezzo a tutti quelli piccoli, ART mette tutti gli oggetti di grandi dimensioni e le bitmap in un mucchio separato. E poi i piccoli oggetti vanno nell'heap separato. Inoltre può deframmentare.

Dopo ART, se usi EnumAndroid, non ti interessa e questo è il motivo per cui la raccomandazione è sparita ora.

Questo viene da Chet Haase su Google. Consiglio di trovare il suo discorso sull'I / O di Google e di guardare l'intero video. Contiene molte informazioni utili e approfondimenti su Android.


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.