我剖析我的Android遊戲,驚訝地發現:列表迭代器會導致堆分配?
for(O o : myArrayList)
{
}
創建一組堆分配的。
除了使用數字i++
for循環,有沒有更好的方法來解決這個問題?我可以預先分配我的迭代器或其他東西嗎?
我剖析我的Android遊戲,驚訝地發現:列表迭代器會導致堆分配?
for(O o : myArrayList)
{
}
創建一組堆分配的。
除了使用數字i++
for循環,有沒有更好的方法來解決這個問題?我可以預先分配我的迭代器或其他東西嗎?
這個循環,
for(O o : myArrayList)
{
}
被轉換爲:
for(Iterator<O> iter = myArrayList.iterator(); iter.hasNext();)
{
O o = iter.next();
}
所以迭代器的對象將會得到在堆中分配,如果你使用這種模式。
如果你寫這樣的:
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
參與。
這是否仍然會導致GC被調用得比應該多得多?這是我想要阻止的。 – jmasterx
我認爲如果你在循環外面聲明'O o;',每次它只會改變列表中元素的引用,這應該會更好。 –
這些對象(循環迭代器)很可能只存在於託兒所中,並且永遠不會貢獻給主要的GC收集。 –
不,沒有性能損失。 採取在此[響應]看看[1] [1]:http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a爲循環和爲每個循環 –
我不關心性能,我只是想避免垃圾收集器在我的遊戲。 – jmasterx