2016-08-30 2 views
5

몇 가지 빠른 벤치마킹 후 컬렉션이 IList 인 것으로 생각되면 IEnumerable.Last() (LINQ)에 대한 호출이 최적화되었는지 여부를 확인하기 위해 .NET Core 소스를 살펴 보았습니다. 그러나 It turns out that yes, the input is specifically checked for IList, 그 전에도 입력이 IPartition을 구현하는지 확인합니다. IPartition is defined here,하지만 나는 그것이 무엇을 해야하는지 전혀 이해하지 못합니다..NET 코어에서 IPartition은 무엇을합니까?

무엇 IPartition의 목적은 어떻게 가능성이 IList의 보통 일정 시간의 색인보다 더 빨리 (그렇지 않은 경우 또는, 왜 입력이 IList보다 일찍 IPartition에 대한 체크) 될 수 있을까?

+0

데이터의 하위 집합을 만들기 위해 'Take'와 같은 메소드에서 사용 된 것으로 보입니다. 'IQueryable' 등을 사용할 때 데이터가 완전히로드되기 전에 많은 linq 메소드가 호출 될 수 있다는 것을 명심하십시오. 'IPartition'을 검사하면 부적절한 최적화가 가능할 수 있습니다. –

답변

4

컬렉션이 인덱스를 지원할 때 인덱스 (Take/Skip 및 기타)에서 작동하는 열거 가능한 메소드를 최적화합니다. IIListProvider과 관련 있습니다.

약간의 implementations이 있습니다. 파일을 검색하여 IPartition.

issues이 있습니다.

IPartition은 기본 컬렉션에 상위 수준 작업을 위임 할 수 있습니다. 예를 들어 new int[10].Skip(1)은 모든 데이터가 두 개의 IEnumerable<int>을 통과하기 때문에 속도가 느립니다. IPartition 구현을 사용하면 효과적으로 for (int i = 1 ... 9) emit(list[i]);이됩니다. 따라서 중간 열거자를 사용하지 않고 열거하는 것보다 약간 빠른 목록 인덱서를 호출합니다.

이것은 매우 대략적인 설명입니다. Github 토론과 코드를 확인하시기 바랍니다.

관련 문제