2010-08-09 27 views
7

Tôi đang lặp qua một loại ẩn danh với khoảng 1000 phần tử.linq foreach performance

Câu hỏi đặt ra ở đây là làm thế nào có thể vòng lặp của tôi mất gần 3 giây để hoàn thành trong khi những gì bên trong vòng lặp xảy ra mất ít hơn 1 ms. Với một nghìn yếu tố tôi hình vòng lặp phải hoàn thành trong vòng hai, không phải 3.

Có cách nào để làm cho nó lặp nhanh hơn không?

// takes 1ms to complete 
     var x = tt.Where(p => p.Methods.Count() > 0 && p.PerWeek != this.Project.WorkDaysCount && !p.IsManual); 

// takes almost 3 seconds to complete 
        foreach (var item in x) 
        { 
         // do stuff that takes < 1 ms 
        } 

Trả lời

14

LINQ sử dụng thực thi chậm. Truy vấn LINQ của bạn không thực sự thực thi cho đến khi ai đó sử dụng IEnumerable được trả về. Thời gian thực hiện bạn đang thấy là kết quả của truy vấn, không phải là foreach.

+0

ofcourse. Tôi không nhận ra. Cảm ơn. – Jeroen

7

Thực thi hoãn lại. viết x.ToList(); và cũng mất khoảng 3 giây.

15

Hai gợi ý ngay:

  • Không sử dụng p.Methods.Count() > 0 - mà cần phải thực hiện một số đầy đủ, ngay cả khi bạn chỉ cần biết nếu có bất kỳ yếu tố. Sử dụng p.Methods.Any() để thay thế.
  • Không tính this.Project.WorkDaysCount trên mỗi lần lặp lại. Chúng tôi không biết chi tiết về những gì đang xảy ra ở đó, nhưng nó có thể tốn kém. Tính toán trước nó và sử dụng hằng số.

Dưới đây là đoạn code truy vấn cải thiện:

int workDaysCount = Project.WorkDaysCount; 
var x = tt.Where(p => p.Methods.Any() && 
       p.PerWeek != workDaysCount && 
       !p.IsManual); 

Như những người khác đã nói, lý do việc xây dựng truy vấn bản thân không mất bất cứ lúc nào đáng kể được đó là nó không phải làm bất kỳ công việc thực tế. Tuy nhiên, biết rằng điều đó không làm cho nó nhanh hơn, tất nhiên :)

Ngoài ra, chúng ta sẽ cần phải biết thêm về ngữ cảnh. Đây có phải là LINQ to Objects, LINQ to SQL hay cái gì khác không? Loại tt là gì?

+0

Đây là một phần của mô-đun khá phức tạp. tt là kết quả của một nhóm và xây dựng một bộ sưu tập phụ. Phương pháp dựa trên một số tiêu chí. Đó là LINQ đối tượng. Dựa trên thông tin của bạn, tôi nghĩ rằng tôi có thể tối ưu hóa thêm. Cảm ơn! – Jeroen

1

IEnumerable (x) của bạn sẽ không được đánh giá cho đến khi bạn thực hiện nó