2009-02-16 81 views

Trả lời

46

(cập nhật) Thực tế - có một trường hợp trong đó cấu trúc for hiệu quả hơn; lặp trên một mảng. Trình biên dịch/JIT có optimisations cho kịch bản này miễn là bạn sử dụngarr.Lengthtrong điều kiện:

for(int i = 0 ; i < arr.Length ; i++) { 
    Console.WriteLine(arr[i]); // skips bounds check 
} 

Trong trường hợp rất cụ thể này, nó sẽ bỏ qua các giới hạn kiểm tra, vì nó đã biết rằng nó sẽ không bao giờ vượt quá giới hạn. Điều thú vị là, nếu bạn "tời" arr.Length để cố gắng tối ưu hóa nó bằng tay, bạn ngăn chặn điều này xảy ra:

int len = arr.Length; 
for(int i = 0 ; i < len ; i++) { 
    Console.WriteLine(arr[i]); // performs bounds check 
} 

Tuy nhiên, với container khác (List<T> vv), cẩu là khá hợp lý như một hướng dẫn vi tối ưu hóa.

(cuối cập nhật)


Cả; một vòng lặp for được đánh giá là một vòng lặp while dưới mui xe.

Ví dụ 12.3.3.9 của ECMA 334 (phân công rõ ràng) dictates rằng một vòng lặp for:

for (for-initializer ; for-condition ; for-iterator) embedded-statement 

là về cơ bản tương đương (từ một phân Definite quan điểm (không hoàn toàn giống như nói "trình biên dịch phải tạo IL này ")) như:

{ 
    for-initializer ; 
    while (for-condition) { 
     embedded-statement ; 
     LLoop: 
     for-iterator ; 
    } 
} 

với tiếp tục tuyên bố rằng mục tiêu câu lệnh for được dịch sang báo cáo goto nhắm mục tiêu nhãn LLoop. Nếu tình trạng bị bỏ qua từ báo cáo for, thì đánh giá phân bổ xác định tiếp tục như thể tình trạng là được thay thế bằng true trong việc mở rộng ở trên.

Bây giờ, điều này không có nghĩa là trình biên dịch đã thực hiện chính xác những điều tương tự, nhưng trong thực tế nó khá nhiêu ...

+0

Bạn có thể cung cấp nguồn và trích dẫn để tối ưu hóa thời gian ngắt tối thiểu không? – Krythic

+0

@Krythic chỉ tình cờ gặp: https://codeblog.jonskeet.uk/2009/01/29/for-vs-foreach-on-arrays-and-lists/ bài đăng trên blog của Jon Skeet. – NoxMortem

+0

NoxMortem Cảm ơn – Krythic

2

Cả một. Chúng tương đương nhau. Bạn có thể nghĩ vòng lặp for 'là một cách nhỏ gọn hơn để viết vòng lặp while.

12

Tôi sẽ nói chúng giống nhau và bạn không bao giờ nên thực hiện tối ưu hóa vi mô như vậy.

-1

Có, chúng là các đoạn mã tương đương.

6

Hiệu suất sẽ giống nhau. Tuy nhiên, trừ khi bạn cần truy cập biến số i ngoài vòng lặp thì bạn nên sử dụng vòng lặp for. Điều này sẽ sạch hơn vì i sẽ chỉ có phạm vi trong khối.

3

Hiệu suất chương trình đến từ các thuật toán thích hợp, thiết kế đối tượng tốt, kiến ​​trúc chương trình thông minh, v.v.

Cạo một hoặc hai chu kỳ với vòng lặp trong khi vòng lặp sẽ KHÔNG BAO GIỜ thực hiện chương trình chậm hoặc chương trình nhanh chậm.

Nếu bạn muốn cải thiện hiệu suất chương trình trong phần này, hãy tìm cách để hủy bỏ một phần vòng lặp (xem Duff's Device) hoặc cải thiện hiệu suất của những gì được thực hiện bên trong vòng lặp.

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