2012-11-10 11 views
7

Sto profiling mio gioco Android e sorpreso di vedere che:L'iteratore di lista causa allocazioni di heap?

for(O o : myArrayList) 
{ 
} 

Crea un gruppo di allocazioni di heap.

Oltre all'utilizzo del ciclo numerico i++ per ciclo, esiste un modo migliore per aggirare questo problema? Posso preassegnare i miei iteratori o qualcosa del genere?

+0

No, non c'è penalità di prestazioni. Date un'occhiata a questo [risposta] [1] [1]: http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a -for-loop-and-a-for-each-loop –

+1

Non mi interessa la performance, voglio solo evitare il garbage collector nel mio gioco. – jmasterx

risposta

4

Questo ciclo,

 for(O o : myArrayList) 
    { 
    } 

viene convertito in:

 for(Iterator<O> iter = myArrayList.iterator(); iter.hasNext();) 
    { 
     O o = iter.next(); 
    } 

Così gli oggetti iteratori sarà sempre stanziati nel mucchio, se si utilizza questo modello.

Se si scrive come:

 O o = null; 
    for(Iterator<O> iter = myArrayList.iterator(); iter.hasNext();) 
    { 
     o = iter.next(); 
    } 

o

O o = null; 
    Iterator<O> iter = myArrayList.iterator(); 
    while(iter.hasNext()){ 
     o = iter.next(); 
    } 

poi penso che non ci sarà molto di GC coinvolgimento nell'iterazione come il suo coinvolge solo l'assegnazione di riferimenti a oggetti esistenti.

+0

Ciò causerà comunque il richiamo del GC molto più del dovuto? Questo è quello che voglio impedire. – jmasterx

+0

Penso che se dichiari 'O o;' fuori dal ciclo allora ogni volta cambierà il riferimento di 'o' con elementi della lista, che dovrebbe essere migliore. –

+1

Probabilmente questi oggetti (loop iterator) esistono solo nella nursery e non contribuiranno mai a una raccolta GC principale. –

Problemi correlati