2012-04-18 34 views
18

Câu hỏi của tôi là liên quan đến tối ưu hóa trong java bằng cách sử dụng trình biên dịch Android. Sẽ map.values ​​() trong sau đây được gọi là mỗi lần lặp lại, hoặc sẽ trình biên dịch Android tối ưu hóa nó ra.phương pháp trong foreach và cho vòng trong java

LinkedHashMap<String, Object> map; 

for (Object object : map.values()) 
{ 
    //do something with object 
} 

Tương tự như vậy, đây là một ví dụ khác. sẽ aList.size() được gọi là mỗi lần lặp?

List<Object> aList; 

for (int i = 0; i < aList.size(); i++) 
{ 
    object = aList.get(i); 
    //do something with i 
} 

Và sau tất cả điều này, liệu nó có thực sự quan trọng nếu nó gọi phương thức mỗi lần lặp lại? Map.values ​​() và List.size() có làm được gì nhiều không?

+1

Đây là một câu hỏi Java thực sự không liên quan gì đến Android. –

+0

Tôi hiểu được sự quan tâm của câu hỏi này, nhưng đối với bất kỳ mục đích thực tế nào, tôi đặc biệt khuyên bạn nên sử dụng mã hồ sơ trước khi tối ưu hóa nó. –

+0

@PhilippReichart - Nó có ý nghĩa hoàn hảo để hỏi liệu một kiểu mã hóa có một lợi thế hiệu năng vốn có hơn một kiểu khác. Ngoài ra, hồ sơ có giới hạn của nó. Nếu bạn đang mã hóa cho Android, mã của bạn có khả năng chạy trên nhiều nền tảng khác nhau, một số trong đó có thể có trình biên dịch JIT, một số trong đó sẽ không có, và một số trong đó thậm chí không tồn tại. –

Trả lời

37

Trong ví dụ đầu tiên, map.values() sẽ được đánh giá một lần. Theo Section 14.4.2 of the Java Language Specification, nó tương đương với:

for (Iterator<Object> i = map.values().iterator(); i.hasNext();) { 
    Object object = i.next(); 
    // do something with object 
} 

Trong phần thứ hai, aList.size() sẽ được gọi mỗi khi thử nghiệm được đánh giá. Để dễ đọc, tốt hơn nên viết mã là:

for (Object object : aList) { 
    // do something with object 
} 

Tuy nhiên, mỗi Android docs, điều này sẽ chậm hơn. Giả sử rằng bạn không thay đổi kích thước danh sách bên trong vòng lặp, nhanh nhất cách khác sẽ được kéo ra kích thước danh sách trước khi vòng lặp:

final int size = aList.size(); 
for (int i = 0; i < size; i++) 
{ 
    object = aList.get(i); 
    //do something with i 
} 

này sẽ nhanh hơn đáng kể (các tài liệu liên quan Android ở trên nói theo hệ số 3) nếu aList xảy ra là ArrayList, nhưng có khả năng chậm hơn (có thể là rất nhiều) cho số LinkedList. Tất cả phụ thuộc vào chính xác loại List lớp thực hiện aList là gì.

+0

"Tài liệu Android" là liên kết bị hỏng. Đây là phiên bản mới: https://developer.android.com/training/articles/perf-tips.html#Loops. Nó cho biết thêm một điều chỉnh nhỏ cho những gì Ted nói về vòng lặp nhanh nhất - không phải nhanh nhất cho các thiết bị không có JIT ("foreach" là nhanh nhất, và "foreach" không thể phân biệt được với "vòng lặp fastes của Ted" trên các thiết bị có JIT). –

+0

@JustinCase - Cảm ơn bạn đã theo dõi vị trí mới (và thông tin mới). Tôi đã cập nhật liên kết trong chính câu trả lời. –

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