2012-02-24 29 views
8

Tôi hiểu rằng thực hiện các hoạt động trong đơn đặt hàng khác nhau sẽ mang lại hiệu suất khác nhau như sự khác biệt giữa các truy vấn chậm sau:Thứ tự của vị từ quan trọng khi sử dụng LINQ?

List<TestItem> slowResults = items.OrderBy(item => item.StringItem) 
            .Where(item => item.IntItem == 100) 
            .ToList(); 

và nhanh hơn này một:

List<TestItem> fastResults = items.Where(item => item.IntItem == 100) 
            .OrderBy(item => item.StringItem) 
            .ToList(); 

Nhưng đó không phải là của tôi câu hỏi:

Câu hỏi của tôi là về hiệu suất của mạch ngắn vì nó rela tes đến một vị từ LINQ. Khi tôi sử dụng mệnh đề Where, như trong trường hợp này:

List<TestItem> results = items.Where(item => item.Item1 == 12 && 
              item.Item2 != null && 
              item.Item2.SubItem == 65 && 
              item.Item3.Equals(anotherThingy)) 
           .ToList(); 

Thứ tự của đối số không quan trọng? Ví dụ, tôi mong đợi rằng làm một .Equals đầu tiên sẽ dẫn đến một truy vấn chậm hơn tổng thể do việc đánh giá số nguyên Item1 == 12 là một hoạt động nhanh hơn nhiều?

Nếu đơn đặt hàng quan trọng, giá trị của nó là bao nhiêu? Tất nhiên, các phương thức gọi như .Equals có lẽ là kết quả chậm hơn nhiều so với nếu tôi chỉ so sánh một vài số nguyên, nhưng nó có phải là một hình phạt hiệu suất tương đối nhỏ so với LINQ hoạt động chậm hay không? Như LINQ làm cho tấn của các cuộc gọi phương thức, là một cái gì đó như .Equals thực sự sẽ quan trọng kể từ khi - trừ khi nó ghi đè - nó sẽ được thực hiện mã khuôn khổ bản địa, phải không? Mặt khác, một cuộc gọi phương thức MSIL tiêu chuẩn sẽ chậm hơn đáng kể?

Ngoài ra, có bất kỳ tối ưu hóa trình biên dịch nào khác trên truy vấn này có thể tăng tốc độ này dưới mui xe không?

Cảm ơn những suy nghĩ và làm rõ! Brett

+2

LINQ cho những gì? – SLaks

+0

Tôi đã suy nghĩ LINQ to Objects, nhưng tôi cho rằng câu hỏi thậm chí còn quan trọng hơn đối với LINQ to SQL. – Brett

+2

Mặc dù tôi không biết LINQ____, nếu nó giống như các ngôn ngữ ngắn mạch khác, thứ tự quan trọng, bởi vì nếu biểu thức được đánh giá bao giờ trở thành đúng hoặc chắc chắn sai, phần còn lại của các biến vị ngữ có thể được loại bỏ một cách an toàn. Ví dụ, trong biểu thức '(1 == 1 || x == 3)', 'x == 3' sẽ không bao giờ được đánh giá bởi vì bất kể kết quả là gì, biểu thức sẽ đúng. Một ví dụ đơn giản tương tự có thể là '(1 == 0 && x == 3)', trong đó sau khi '1 == 0' được tìm thấy là sai, nó chỉ thoát vì không có cách nào biểu thức có thể đúng. Xin lỗi nếu đây không phải là những gì bạn đang tìm kiếm! – prelic

Trả lời

13

Câu trả lời sẽ khác nhau đối với các nhà cung cấp LINQ khác nhau. Đặc biệt, câu chuyện rất khác với LINQ to Objects và nói LINQ to Entities.

Trong LINQ to Objects, toán tử Where chấp nhận bộ lọc là Func < TSource, bool >. Func <, > là một đại biểu, vì vậy cho các mục đích của cuộc thảo luận này, bạn có thể nghĩ nó như một con trỏ hàm. Trong LINQ to Objects, truy vấn tương đương như sau:

static void Main() { 
    List<TestItem> results = items.Where(MyFilter).ToList(); 

static boolean MyFilter(TestItem item) { 
    return item.Item1 == 12 && 
     item.Item2 != null && 
     item.Item2.SubItem == 65 && 
     item.Item3.Equals(anotherThingy) 
} 

Điều quan trọng cần ghi nhận là MyFilter là một C# phương pháp thông thường và quá bình thường C# quy tắc áp dụng, bao gồm các hành vi ngắn mạch của & &. Do đó, các điều kiện sẽ được đánh giá theo thứ tự bạn đã viết chúng. LINQ to Objects có thể gọi MyFilter trên các phần tử đầu vào khác nhau, nhưng nó không thể thay đổi MyFilter làm gì.

Trong LINQ to Entities và LINQ to SQL, các nhà điều hành ở đâu chấp nhận các bộ lọc như Biểu < Func < TSource, bool > >. Bây giờ, bộ lọc được chuyển vào toán tử Where ở dạng cấu trúc dữ liệu mô tả biểu thức. Trong trường hợp đó, nhà cung cấp LINQ sẽ xem xét cấu trúc dữ liệu ("cây biểu thức") và tùy thuộc vào nhà cung cấp LINQ để quyết định cách diễn giải nó.

Trong LINQ to Entities và LINQ to SQL, cây biểu thức sẽ được dịch sang SQL. Và sau đó tùy thuộc vào máy chủ cơ sở dữ liệu để quyết định cách thực hiện truy vấn.Máy chủ chắc chắn được phép sắp xếp lại các điều kiện và có thể thậm chí còn tối ưu hóa đáng kể hơn nữa. Ví dụ, nếu bảng SQL chứa một chỉ mục trên một trong các cột được tham chiếu trong điều kiện, máy chủ có thể chọn sử dụng chỉ mục và tránh xem xét các hàng không khớp với phần điều kiện cụ thể đó.

+0

Cảm ơn câu trả lời chi tiết! – Brett

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