2012-11-10 35 views
7

Tôi profiling game android của tôi và ngạc nhiên khi thấy rằng:Danh sách vòng lặp gây ra phân bổ đống?

for(O o : myArrayList) 
{ 
} 

Tạo một loạt các phân bổ heap.

Ngoài việc sử dụng số i++ cho vòng lặp, có cách nào tốt hơn để giải quyết vấn đề này không? Tôi có thể preallocate iterator của tôi hoặc một cái gì đó?

+0

Không, không có hình phạt về hiệu suất. Hãy xem về vấn đề này [phản ứng] [1] [1]: http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a -cho-vòng-và-một-cho-mỗi-vòng lặp –

+1

Tôi không quan tâm đến hiệu suất, tôi chỉ muốn tránh các nhà sưu tập rác trong trò chơi của tôi. – jmasterx

Trả lời

4

Vòng lặp này,

 for(O o : myArrayList) 
    { 
    } 

được chuyển đổi sang:

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

Vì vậy, đối tượng Iterator sẽ bị cấp phát trên heap, nếu bạn sử dụng mô hình này.

Nếu bạn viết như:

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

hoặc

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

sau đó tôi nghĩ rằng sẽ không có nhiều GC tham gia trong lần lặp như nó chỉ liên quan đến phân công tham chiếu đối tượng hiện có.

+0

Điều này vẫn khiến cho GC bị gọi nhiều hơn mức phải không? Đó là những gì tôi muốn ngăn chặn. – jmasterx

+0

Tôi nghĩ nếu bạn khai báo 'O o;' bên ngoài vòng lặp thì mỗi lần nó sẽ chỉ thay đổi tham chiếu của 'o' với các phần tử của danh sách, nên tốt hơn. –

+1

Các đối tượng này (vòng lặp vòng lặp) sẽ hầu như chỉ tồn tại trong vườn ươm và sẽ không bao giờ đóng góp vào bộ sưu tập GC chính. –

Các vấn đề liên quan