Gần đây tôi đã bắt đầu sử dụng LINQ khá nhiều và tôi chưa thực sự thấy bất kỳ đề cập nào về độ phức tạp thời gian chạy đối với bất kỳ phương thức LINQ nào. Rõ ràng, có nhiều yếu tố đang diễn ra ở đây, vì vậy chúng ta hãy giới hạn cuộc thảo luận ở IEnumerable
nhà cung cấp LINQ-to-Objects đơn giản . Hơn nữa, hãy giả sử rằng bất kỳ cái nào Func
được chuyển vào dưới dạng bộ chọn / bộ đột biến / v.v. là một phép toán O (1) rẻ tiền.
Có vẻ như rõ ràng rằng tất cả các hoạt động đơn lẻ-pass ( Select
, Where
, Count
, Take/Skip
, Any/All
, vv) sẽ là O (n), vì họ chỉ cần đi bộ trình tự một lần; mặc dù ngay cả điều này là tùy thuộc vào sự lười biếng.
Mọi thứ trở nên tồi tệ hơn đối với các hoạt động phức tạp hơn; tập giống như các nhà khai thác ( Union
, Distinct
, Except
, vv) việc sử dụng GetHashCode
theo mặc định (afaik), vì vậy nó có vẻ hợp lý để cho rằng họ đang sử dụng một bảng băm trong nội bộ, làm cho các hoạt động này O (n) là tốt, nói chung. Điều gì về các phiên bản sử dụng một IEqualityComparer
?
OrderBy
sẽ cần một sự sắp xếp, vì vậy rất có thể chúng ta đang xem xét O (n log n). Nếu nó đã được sắp xếp thì sao? Còn nếu tôi nói OrderBy().ThenBy()
và cung cấp cùng một khóa cho cả hai?
Tôi có thể thấy GroupBy
(và Join
) bằng cách sử dụng sắp xếp hoặc băm. Đó là cái nào?
Contains
sẽ là O (n) trên a List
, nhưng O (1) trên a HashSet
- LINQ có kiểm tra vùng chứa bên dưới để xem liệu nó có thể tăng tốc mọi thứ không?
Và câu hỏi thực sự - cho đến nay, tôi đã tin tưởng rằng các hoạt động là hiệu quả. Tuy nhiên, tôi có thể gửi ngân hàng vào đó không? Ví dụ, các thùng chứa STL chỉ rõ mức độ phức tạp của mọi hoạt động. Có bất kỳ đảm bảo tương tự nào về hiệu suất LINQ trong đặc tả thư viện .NET không?
Câu hỏi khác (trả lời các bình luận): Tôi
chưa thực sự nghĩ về chi phí, nhưng tôi không mong đợi sẽ có rất nhiều thứ cho Linq-to-Objects đơn giản. Bài đăng CodingHorror đang nói về Linq-to-SQL, nơi tôi có thể hiểu việc phân tích cú pháp truy vấn và tạo SQL sẽ làm tăng thêm chi phí - có phải cũng có chi phí tương tự cho nhà cung cấp Đối tượng không? Nếu vậy, nó có gì khác nếu bạn đang sử dụng cú pháp khai báo hoặc hàm?