2013-07-18 34 views
5

Trong khi làm việc trên một dự án, tôi chạy vào đoạn mã sau đây, đã nâng cờ hiệu suất.foreach loop Danh sách sự khác biệt hiệu suất

foreach (var sample in List.Where(x => !x.Value.Equals("Not Reviewed"))) 
{ 
    //do other work here 
    count++; 
} 

tôi quyết định chạy một vài xét nghiệm nhanh chóng so sánh vòng lặp ban đầu cho vòng lặp sau:

foreach (var sample in List) 
{ 
    if (!sample.Value.Equals("Not Reviewed")) 
    { 
     //do other work here 
     count++; 
    } 
} 

và ném vòng lặp này trong quá để xem những gì sẽ xảy ra:

var tempList = List.Where(x => !x.Value.Equals("Not Reviewed")); 
foreach (var sample in tempList) 
{ 
    //do other work here 
    count++; 
} 

Tôi cũng phổ biến danh sách gốc 3 cách khác nhau: 50-50 (vì vậy 50% giá trị trong đó "Không được đánh giá" và các giá trị còn lại khác), 10-90 và 90-10. Đây là kết quả của tôi, các vòng đầu tiên và cuối cùng là hầu như giống nhau nhưng cái thứ hai nhanh hơn nhiều, đặc biệt là trên trường hợp 10-90. Tại sao chính xác? Tôi luôn nghĩ rằng Lambda có hiệu suất tốt.

EDIT

Các count++ không thực sự là những gì bên trong vòng lặp, tôi chỉ nói thêm rằng đây cho mục đích trình diễn, tôi đoán tôi nên đã sử dụng "// do something here"

Performance Results

EDIT 2

Kết quả chạy mỗi 1000 lần: Performance Results 1000 times

+2

Sẽ rất thú vị khi xem cách 'List.Where (x =>! X.Value.Equals (" Not Reviewed ")). Count()' thực hiện so với những thứ đó. –

+11

@MikePrecup: Hoặc thậm chí tốt hơn, 'List.Count (x =>! X.Value.Equals (" Not Reviewed "))' –

+1

Bạn đã chắc chắn rằng bạn đã không thực hiện bất kỳ [sai số điểm chuẩn hiệu suất] nào (http: : //tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one)? – Corak

Trả lời

9

Về cơ bản, có một số tiền nhỏ về mình thêm - cả cho kỳ thi thông qua một đại biểu, và cho phần iterating. Chỉ cho biết công việc đang được thực hiện như thế nào cho mỗi lần lặp lại, việc thêm vào đó là tương đối đắt đỏ.

Điều đó không đáng ngạc nhiên cũng không đáng lo ngại, theo quan điểm của tôi. Đó là loại tối ưu hóa vi mô, bạn có thể dễ dàng thực hiện nếu bạn đang ở trong tình trạng hiếm hoi của nó là đáng kể trong ứng dụng trong thế giới thực của bạn. Theo kinh nghiệm của tôi, nó khá hiếm cho loại vòng lặp này là một nút cổ chai đáng kể trong ứng dụng.Cách tiếp cận thông thường nên là:

  • Xác định các yêu cầu hiệu suất
  • Thực hiện các yêu cầu chức năng trong, cách đơn giản nhất rõ ràng nhất bạn có thể
  • Đo hiệu suất của bạn chống lại các yêu cầu
  • Nếu hiệu suất được tìm thấy muốn, điều tra lý do tại sao và chỉ di chuyển ra khỏi sự rõ ràng ít nhất có thể, nhận được "cú hích lớn nhất" lớn nhất mà bạn có thể
  • Lặp lại cho đến khi bạn hoàn thành

Đối phó với một biên tập:

Số đếm ++ không phải là thực sự những gì bên trong vòng lặp, tôi chỉ nói thêm rằng đây cho mục đích trình diễn, tôi đoán tôi nên đã sử dụng "// do something here"

Vâng đó là bit quan trọng - càng có nhiều công việc được thực hiện ở đó, thì càng ít điều quan trọng hơn. Chỉ cần đếm là khá darned nhanh, vì vậy tôi mong đợi để thấy một sự khác biệt lớn. Làm bất kỳ số lượng công việc thực sự nào, và sự khác biệt sẽ nhỏ hơn.

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