2012-11-10 10 views
7

私はアンドロイドのゲームをプロファイリングして、それを見て驚いています:リストイテレータはヒープ割り当てを行いますか?

for(O o : myArrayList) 
{ 
} 

は、ヒープ割り当ての束を作成します。

ループに数値i++を使用する以外にも、この問題を回避するにはより良い方法がありますか?イテレータや何かを事前に割り当てることはできますか?あなたはこのパターンを使用するのであればイテレータオブジェクトは、ヒープに割り当て取得されます

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

+0

いいえ、パフォーマンスのペナルティはありません。 [1]この[応答]の[1] を見てみましょう:http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a -for-for-each-loop –

+1

私はパフォーマンスには関心がありません。私は自分のゲームでガベージコレクターを避けたいだけです。 – jmasterx

答えて

4

このループ、

 for(O o : myArrayList) 
    { 
    } 

はに変換されます。

あなたのような書き込みをした場合:

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

または

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

その後、私は、そのだけで、既存のオブジェクト参照の割り当てを必要とするよう繰り返しでGC関与の多くは存在しないだろうと思います。

+0

これは引き続き、GCが必要以上に多く呼び出される原因になりますか?それが私が避けたいものです。 – jmasterx

+0

ループの外側で 'O o;'を宣言すると、リストの要素で 'o'の参照が変更されるたびに改善されるはずです。 –

+1

これらのオブジェクト(ループイテレータ)はほとんどの場合、保育園内にのみ存在し、主要なGC収集には貢献しません。 –

関連する問題