Autore Topic: Garbage collector  (Letto 840 volte)

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Garbage collector
« il: 14 Maggio 2013, 17:55:30 CEST »
0
Salve ragazzi, ho una domanda per i più esperti. Sapete per caso se la Cyanogen introduce miglioramenti per quanto riguarda la gestione della RAM? Migliora il garbage collector? Oppure non ci sono modifiche a questo livello?
Sto impazzendo perché sto facendo girare un oneroso processo su due terminali diversi: il primo è l'LG O1 con CM7 (senza swap partition), il secondo è il Samsung Galaxy Nexus con Android 4 IceCream "di fabbrica". Il processo fa grosso utilizzo di ArrayList, query a SQLite e lavora quasi esclusivamente con stringhe. Il paradosso è che sul Nexus ci impiega 20 minuti, mentre sull' LG P500 ne impiega mediamente poco più di 8, quindi meno della metà del Nexus. Non riesco proprio a trovare una spiegazione per questo fenomeno mistico. Ah dimenticavo... sul Samsung Galaxy S1, impiega poco più di 20 minuti. Come è possibile una cosa simile?
So già che sarà difficile trovare una risposta!!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Garbage collector
« Risposta #1 il: 14 Maggio 2013, 18:34:11 CEST »
0
Difficile risponderti, non fornisci dettagli sul codice, ti consiglio di seguire questo intervento fatto in un Goole I/O:

http://www.google.com/events/io/2011/sessions/memory-management-for-android-apps.html

chiarisce e consiglia come gestire al meglio la memoria e quali tool di analisi utilizzare.

Da come descrivi il problema hai molto probabilmente un codice poco ottimizzato, sicuramente istanzi molti oggetti, in Java la regola d'oro delle ottimizzazioni è riutilizzare il più possibile gli oggetti creati. Questi sono i consigli di Google su come ottimizzare il codice per Android:

http://developer.android.com/training/articles/perf-tips.html

La Cyanogen è di quanto più simile alla versione ufficiale di Android, molti fabbricanti modificano il codice e aggiungano pesanti programmi personalizzati, ad esempio il launcher, riducendo le risorse disponibili all'utente.
adb logcat | tee /tmp/logcat | grep TAG

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Garbage collector
« Risposta #2 il: 14 Maggio 2013, 19:47:02 CEST »
0
Il codice è proprio pesante e lungo (è una tesi di laurea un po' particolare). La cosa strana è il fatto che su un dispositivo dall' hardware molto meno performante richieda la metà del tempo rispetto a quello richiesto su un dispositivo come il Nexus.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Garbage collector
« Risposta #3 il: 14 Maggio 2013, 20:33:05 CEST »
0
Come dice iceweasel è molto difficile fare supposizioni senza vedere nemmeno una riga di codice.

Tuttavia, il terminale LG ha un display con meno della metà dei pixel, per cui se la tua app fa qualcosa che implica accedere e disegnare qualcosa su tutti i pixel, ci sta che ci metta di meno con meno pixel.

So di arrampicarmi sugli specchi, ma d'altra parte queste sono le informazioni che ho.

PS: cosa usi per lavorare con le stringhe? Non STRING voglio sperare.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Garbage collector
« Risposta #4 il: 14 Maggio 2013, 22:18:45 CEST »
0
Uso molti arraylist<String>. Non viene disegnato niente. Si fa "solo" parsing ed elaborazioni. La cosa strana è che l'lg assegna la metà dell'heap assegnato dal nexus, tuttavia l'heap del nexus è occupato, per tutta la durata del processo, al 90% mentre quello dell'lg al 50! È proprio una diversa gestione della memoria.

Inviato dal mio LG-P500 con Tapatalk 2

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Garbage collector
« Risposta #5 il: 14 Maggio 2013, 22:49:42 CEST »
0
Devi usare dei tool per esaminare la memoria come spiegato nel video di Google:

Eclipse Memory Analyzer Open Source Project
Profiling with Traceview and dmtracedump | Android Developers

servono per trovare memory leakage da correggere e tracciare il codice per individuare parti di codice troppo lente per poi ottimizzarle se possibile.

Non hai specificato la versione della Cyanogenmod, qui ci sono i cambiamenti più importanti:

http://oldwiki.cyanogenmod.org/wiki/CyanogenMod_4_Changelog

alcuni riguardano la memoria.
adb logcat | tee /tmp/logcat | grep TAG

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Garbage collector
« Risposta #6 il: 14 Maggio 2013, 22:57:19 CEST »
0
Uso molti arraylist<String>.

per le performance, manipolare testo usando String è un errore colossale, perchè ogni volta che alteri una string, ne crei una nuova.

prova a passare a stringbuffer o meglio ancora a stringbuilder, potresti avere clamorose sorprese sul tempo di esecuzione.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lionell88

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Mostra profilo
Re:Garbage collector
« Risposta #7 il: 14 Maggio 2013, 23:29:27 CEST »
0
Vi ringrazio ragazzi! L'unica cosa, al di là del codice, su cui credo sia inutile discutere perché non potrei spiegare qui cosa faccio, è la colossale differenza di tempo di esecuzione tra i due dispositivi. Questo è ciò che mi tormenta. Volevo solo sapere se la cm 7 aveva miglioramenti specifici sulla gestione della memoria. Ps non vado a manipolare le stringhe in sé, faccio solo confronti tra parole (detto in soldoni) e devo purtroppo memorizzarle in memoria.

Inviato dal mio LG-P500 con Tapatalk 2

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Garbage collector
« Risposta #8 il: 15 Maggio 2013, 00:37:41 CEST »
0
Se fai tanti confronti tra stringhe allora la Cyanogenmod ha una ottimizzazione sulla funzione strcmp in assembler per ARM:

http://review.cyanogenmod.org/#/c/32317/

adb logcat | tee /tmp/logcat | grep TAG