2010-04-07 12 views
10

Continuo a sentire che le applicazioni Android dovrebbero cercare di limitare il numero di oggetti creati per ridurre il carico di lavoro sul garbage collector. È logico che non si desideri creare un numero enorme di oggetti da tracciare su un ingombro di memoria limitato, ad esempio su un'applicazione server tradizionale creata 100.000 oggetti in pochi secondi non sarebbero inauditi.Modifica dello stile di codifica dovuto alle prestazioni del GC di Android, quanto è lontano?

Il problema è quanto lontano dovrei prendere questo? Ho visto un sacco di esempi di applicazioni Android che si basano su uno stato statico per "velocizzare le cose". Aumentare il numero di istanze che devono essere raccolte dalla spazzatura da dozzine a centinaia può davvero fare la differenza? Posso immaginare di cambiare il mio stile di codifica per creare ora centinaia di migliaia di oggetti come si potrebbe avere su un server Java-EE in piena regola, ma basarsi su un gruppo di stati statici per (presumibilmente) ridurre il numero di oggetti da raccogliere. dispari.

Quanto è veramente necessario modificare lo stile di codifica per creare app Android performanti?

risposta

10

Il consiglio "evitare l'assegnazione" è di solito in relazione ai circuiti di gioco. La VM deve mettere in pausa per raccogliere i rifiuti, e non vuoi che ciò accada mentre il tuo gioco si anima a 30fps. Se non si assegnano oggetti, la VM non dovrà raccogliere i dati inutili per liberare memoria. Se si dispone di un gioco che deve essere eseguito senza intoppi visibili dall'utente, è necessario prendere in considerazione la possibilità di modificare il codice nelle parti pertinenti per ridurre o eliminare l'allocazione.

Se stai realizzando un'app che contiene ricette o mostra foto, non me ne preoccuperei: il singhiozzo di GC non è qualcosa che l'utente probabilmente noterà.

I futuri miglioramenti del GC Dalvik (ad esempio la raccolta generazionale) dovrebbero rendere questo problema meno importante.

+3

Vorrei anche aggiungere che troverete spesso codice Java che è stato scritto in origine per desktop o server che è estremamente inefficiente e attraverserà una tonnellata di oggetti rispetto alla quantità di lavoro che fa. Ad esempio, ho visto il codice di rete che causa continuamente GC mentre elabora i dati dalla rete. Se il tuo codice sta facendo questo, dovresti davvero cercare di ottimizzarlo, non specificamente a causa di Dalvik, ma poiché non è appropriato per un dispositivo mobile - tutto questo lavoro extra viene direttamente dalla batteria. – hackbod

+1

Per quanto riguarda lo stile che dovrebbe essere effettivamente cambiato, direi che il modo migliore per farlo è scrivere codice che funzioni (e dare un po 'di pensiero al riutilizzo degli oggetti allocati, comunque non molto esteso) e vedere se c'è qualsiasi pressione sul GC. Se c'è, quindi avviare la memoria profilatura del codice e alla ricerca di luoghi in cui è possibile evitare l'allocazione e l'eliminazione di variabili. –

4

Direi che dipende molto da cosa stai facendo e dal tuo stile di codifica. È sempre in qualche modo necessario tenere a mente i limiti hardware di un dispositivo mobile e programmare di conseguenza, ma poi di nuovo, è buona pratica essere a conoscenza di ciò indipendentemente da dove verrà eseguita la tua app. Se stai facendo calcoli molto intensi che devono essere aggiornati in tempo reale o qualcosa di simile a un gioco, allora puoi usare l'NDK, ma se stai facendo solo roba normale da utente non dovrebbe essere così male . Il mio consiglio sarebbe di cercare di essere frugale ma non preoccuparti troppo dell'ottimizzazione fino a quando non avrai un'idea di come funziona.

Problemi correlati