2012-11-10 23 views
7

benim android oyun profilleme ve görmek için sürpriz ediyorum:Liste yineleyicisi yığın ayırmalarına neden olur?

for(O o : myArrayList) 
{ 
} 

yığın ayırma bir demet oluşturur.

Döngü için sayısal bir i++ kullanmanın yanı sıra, bu sorunu çözmek için daha iyi bir yol var mı? Yineleyicilerimi veya başka bir şeyi önleyebilir miyim? Bu modeli kullanan varsa

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

Yani Yineleyici nesneler, öbek üzerinde tahsis elde edilecektir:

+0

Hayır, herhangi bir performans cezası yok. http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a: [1] [1] [tepki] üzerinde bir göz atın -up-loop-ve-için-her-döngü –

+1

Performans ile ilgili değilim, sadece oyunda çöp toplayıcı önlemek istiyorum. – jmasterx

cevap

4

Bu döngü,

 for(O o : myArrayList) 
    { 
    } 

dönüştürülür alır.

gibi yazarsanız:

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

veya

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

sonra onun sadece mevcut nesne başvurularını atama karıştırmak gibi tekrarında GC katılımı çok şey olmayacaktır düşünüyorum.

+0

Bu durum hala GC'nin gerekenden daha fazla çağrılmasına neden olacak mı? Bunu önlemek istediğim şey budur. – jmasterx

+0

Eğer "O" kelimesini ilmek dışında ilan ederseniz, o zaman her seferinde listenin elemanlarıyla daha iyi olması gereken 'o' referansını değiştireceğini düşünüyorum. –

+1

Bu nesneler (döngü yineleyicileri) büyük olasılıkla yalnızca kreşte var olacak ve büyük bir GC koleksiyonuna hiçbir zaman katkıda bulunmayacaktır. –

İlgili konular