메모리 LINQ 성능
-
02-07-2019 - |
문제
상 대 LINQ 하기 좋아하는 공급자는 여기]이 질문에 대한 검색 필터링에서 메모리 컬렉션이 있습니다.
알 LINQ(또는 찾/필터링 확장 방법)에서 작동을 구현하는 객체 IEnumerable
나 IEnumerable<T>
.질문입니다: 의 특성 때문에 열거하는 모든 질의 복잡성에서 최소 O(n)?
예를 들어:
var result = list.FirstOrDefault(o => o.something > n);
이 경우에,각 알고리즘상 걸릴 것입니다 O(n) 지 list
주문한 대하여 'something'
, 는 경우에는 검색을해야 O(로그(n)):그것이 있어야 이진 검색합니다.까지,남녀노소 누구나 좋아합니다 제대로 이해하고,이 쿼리를 통해 해결될 열거형,그래서 그것을 취해야 한다 O(n), 도 list
이전에 주문했다.
- 내가 할 수 있는 해결에서 쿼리 O(로그(n))?
- 고 싶은 경우에는 성능이 사용해야 합니까 배열입니다.종류와 배열입니다.BinarySearch?
해결책
도 parallelisation,그것은 여전히 O(n).일정한 요인이 다른 것입(에 따라 귀하의 코어의 개수)그러나 n 다양한 총 시간은 여전히 따라 선형적인.
물론 작성할 수 있습니다 당신의 자신의 구현의 다양한 LINQ 연산자를 통해 자신의 데이터 형식이지만,그들은 단지에 적합한 매우 특정 상황에 따라 달라질 수 있을 확실히 알고있는 조건자만 운영에 최적화된 측면의 데이터입니다.예를 들어,만약 당신이 가지고있는 사람들의 목록의 주문에 의해 나이를,그것은 당신을 도울 것으로 쿼리를 시도하는 사람을 찾으로 특히 이름:)
을 검사하는 조건자,당신이 사용하는 표현 대신 나무의 대리인,그리고 인생이 될 것이 많은 어렵습니다.
내가 의심되 나는 일반적으로 추가하는 새로운 방법을 만드는것은 분명 너를 사용하여 색인/주문/어떤 성격의 데이터 입력,그리고 항상 적절하게 작동.당신은 쉽지 않다는 호출 그분의 방법에서 쿼리를 표현의 과정,그러나 여전히 사용할 수 있습 LINQ 점 표기법으로.
다른 팁
예, Sklivvz가 말했듯이 일반적인 경우는 항상 O (n)입니다.
그러나, 많은 LINQ 방법은 ienumerable을 구현할 때에 대한 특별한 경우를위한 특별한 경우. (나는 이것을 ienumerable에 대해 보았습니다. 적어도 포함합니다.)
실제로 이것은 LINQ IENUMERABLE을 의미합니다.
IEnumerable<int> mySet = new HashSet<int>();
// calls the fast HashSet.Contains because HashSet implements ICollection.
if (mySet.Contains(10)) { /* code */ }
리플렉터를 사용하여 LINQ 메소드가 정의되는 방법을 정확히 확인할 수 있습니다. 이것이 제가이 점을 알아 냈습니다.
아, 그리고 LINQ에는 ienumerable.todictionary (맵 키) 및 ienumerable.tolookup (지도 키가 다중 값에 대한 맵)을 포함합니다. 이 사전/조회 테이블은 한 번만 만들어 여러 번 사용될 수 있으며, 이는 LINQ 집약적 코드 속도가 크기로 속도를 높일 수 있습니다.
그렇습니다. IEnumerable
O (n)을 의미하는 방법을 사용하는 것입니다.
언어 디자이너가 일반성을 위해 성과를 거래하기로 결정한 고전적인 사례처럼 보입니다.