2012-11-10 13 views
7

Ich Profilierungs mein Android-Spiel und überrascht zu sehen, dass:Listen-Iterator verursacht Heap-Zuordnungen?

for(O o : myArrayList) 
{ 
} 

Erzeugt eine Reihe von Heapzuweisungen.

Abgesehen von einer numerischen i++ for loop, gibt es eine bessere Möglichkeit, um dieses Problem zu umgehen? Kann ich meine Iteratoren vorgeben?

+0

Nein, es gibt keine Leistungseinbußen. Werfen Sie einen Blick auf dieses [Antwort] [1] [1]: http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a -for-loop-und-für-jede-Schleife –

+1

Ich bin nicht mit der Leistung betroffen, ich möchte nur den Müllsammler in meinem Spiel vermeiden. – jmasterx

Antwort

4

Diese Schleife,

 for(O o : myArrayList) 
    { 
    } 

umgewandelt wird:

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

auf dem Heap zugewiesen werden Iterator Objekte immer, wenn Sie dieses Muster verwenden.

Wenn Sie schreiben wie:

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

oder

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

dann denke ich, es nicht viel sein wird, von GC Beteiligung an der Iteration als beinhaltet nur Zuweisung von vorhandenen Objektreferenzen.

+0

Wird dies immer noch dazu führen, dass der GC viel mehr aufgerufen wird, als er sollte? Das möchte ich verhindern. – jmasterx

+0

Ich denke, wenn Sie 'O o;' außerhalb der Schleife deklarieren, dann wird jedes Mal nur die Referenz von 'o' mit Elementen der Liste geändert, was besser sein sollte. –

+1

Diese Objekte (Loop-Iteratoren) werden höchstwahrscheinlich nur in der Gärtnerei existieren und niemals zu einer wichtigen GC-Sammlung beitragen. –