2012-11-10 3 views
7

내 안드로이드 게임을 프로파일 링하고를보고 놀랐 해요 :리스트 반복자가 힙 할당을 유발합니까?

for(O o : myArrayList) 
{ 
} 

는 힙 할당의 무리를 작성합니다.

루프에 숫자 i++을 사용하는 것 외에이 문제를 해결하는 더 좋은 방법이 있습니까? 내 반복자 나 다른 것을 미리 할당 할 수 있습니까? 이 패턴을 사용하는 경우

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

이 그래서 반복자 객체가 힙에 할당하기됩니다

+0

아니요, 성능 저하가 없습니다. http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a : [1] [1] [응답]을 보라 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 수집에 기여하지 않습니다. –

관련 문제