2016-08-30 26 views
5

Tôi đã xem xét nguồn .NET Core để tìm hiểu xem các cuộc gọi tới IEnumerable.Last() (LINQ) có được tối ưu hóa khi bộ sưu tập thực hiện IList mà tôi nghi ngờ là trường hợp sau khi một số điểm chuẩn nhanh chóng. Tuy nhiên, It turns out that yes, the input is specifically checked for IList, ngay cả trước đó, nó được kiểm tra xem đầu vào có thực hiện IPartition hay không. IPartition is defined here, nhưng tôi không hiểu gì cả.IPartition làm gì trong .NET Core?

mục đích IPartition là gì và làm thế nào nó có thể có thể được nhanh hơn so với hằng số thời gian lập chỉ mục thường của IList (hoặc nếu nó không phải là, tại sao đầu vào kiểm tra cho IPartition sớm hơn IList)?

+0

Dường như nó được sử dụng bằng các phương pháp như 'Take' để tạo một tập hợp con dữ liệu. Hãy nhớ rằng nhiều phương thức linq có thể được gọi trước khi dữ liệu được nạp đầy đủ khi sử dụng 'IQueryable' và tương tự. Việc kiểm tra 'IPartition' có thể cho phép một số tối ưu hóa lén lút. –

Trả lời

4

Đó là một tối ưu hóa cho các phương pháp liệt kê hành động trên các chỉ mục (Take/Skip và những người khác) khi bộ sưu tập có hỗ trợ cho các chỉ mục. IIListProvider có liên quan.

Có một vài implementations. Tìm kiếm tệp cho IPartition.

issues về việc này.

IPartition cho phép ủy quyền các hoạt động cấp cao hơn cho bộ sưu tập cơ bản. Ví dụ: new int[10].Skip(1) chậm vì tất cả dữ liệu chạy qua hai IEnumerable<int>. Với việc thực hiện IPartition, điều này sẽ trở thành hiệu quả for (int i = 1 ... 9) emit(list[i]);. Vì vậy, nó không sử dụng các điều tra viên trung gian và nó đang gọi danh sách chỉ mục nhanh hơn một chút so với liệt kê.

Đây là mô tả rất thô. Tôi khuyến khích bạn kiểm tra các cuộc thảo luận Github và mã.

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