2012-11-10 10 views
7

mam profilowania moje gry android i zaskoczony, aby zobaczyć, że:Iterator listy powoduje przydział sterty?

for(O o : myArrayList) 
{ 
} 

Tworzy kilka alokacji sterty.

Oprócz użycia pętli numerycznej i++, czy istnieje lepszy sposób na obejście tego problemu? Czy mogę dokonać wstępnej alokacji moich iteratorów?

+0

Nie, nie ma kary za wydajność. Spójrz na ten [odpowiedzi] [1] [1]: http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a pętla i pętla za każdą pętlę –

+1

Nie jestem zainteresowany wydajnością, chcę tylko uniknąć zbieracza śmieci w mojej grze. – jmasterx

Odpowiedz

4

Ta pętla,

 for(O o : myArrayList) 
    { 
    } 

zostanie przekonwertowany do:

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

Więc obiekty Iterator będą coraz alokowane na stosie, jeśli użyć tego wzoru.

Jeśli piszesz jak:

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

lub

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

to myślę, że nie będzie dużo GC zaangażowania w iteracji jako jej dotyczy tylko przypisanie istniejących odniesień do obiektu.

+0

Czy nadal spowoduje to, że GC zostanie wywołany o wiele bardziej niż powinien? Właśnie tego chcę zapobiec. – jmasterx

+0

Myślę, że jeśli zadeklarujesz 'O o;' poza pętlą to za każdym razem po prostu zmieni odniesienie 'o' z elementami listy, co powinno być lepsze. –

+1

Obiekty te (pętla iteratory) najprawdopodobniej będzie istnieć tylko w przedszkolu i nigdy nie wniesie wkładu do głównej kolekcji GC. –

Powiązane problemy