저는 최근에 LINQ를 꽤 많이 사용하기 시작했으며 LINQ 메서드에 대한 런타임 복잡성에 대한 언급을 실제로 보지 못했습니다. 분명히 여기에는 많은 요소가 작용하므로 일반 IEnumerable
LINQ-to-Objects 공급자에 대한 논의를 제한하겠습니다 . 또한 Func
선택자 / 변이 자 등으로 전달 된 모든 것이 저렴한 O (1) 연산 이라고 가정 해 봅시다 .
그것은 분명한 것 같다 모든 싱글 패스 (single-pass) 작업 (즉 Select
, Where
, Count
, Take/Skip
,Any/All
그들이 한 번만 순서를 걸어야하기 때문에, 등), O (n)이 될 것입니다; 이것조차도 게으름의 대상입니다.
더 복잡한 작업의 경우 상황이 더 어둡습니다. 세트 같은 사업자 ( Union
, Distinct
, Except
, 등)를 사용하여 작업 GetHashCode
기본적으로 (AFAIK), 그들이 일반적으로,뿐만 아니라 이러한 작업의 O (N)를 만들고, 내부적으로 해시 테이블을 사용하는 가정하는 것이 합리적 것 때문에. 를 사용하는 버전은 IEqualityComparer
어떻습니까?
OrderBy
정렬이 필요하므로 O (n log n)을보고있을 가능성이 높습니다. 이미 정렬 된 경우 어떻게합니까? OrderBy().ThenBy()
둘 다 동일한 키를 말하고 제공하면 어떨까요?
정렬 또는 해싱을 사용하여 GroupBy
(및 Join
)을 볼 수 있습니다 . 무엇 이니?
Contains
은 O (n) List
이지만 O (1) HashSet
은-LINQ가 기본 컨테이너를 확인하여 속도를 높일 수 있는지 확인합니까?
그리고 진짜 질문은-지금까지 저는 그 수술이 성능이 좋다는 믿음으로 받아 들였습니다. 그러나 그것에 은행을 둘 수 있습니까? 예를 들어 STL 컨테이너는 모든 작업의 복잡성을 명확하게 지정합니다. .NET 라이브러리 사양에서 LINQ 성능에 대한 유사한 보장이 있습니까?
더 많은 질문 (코멘트에 대한 응답) :
오버 헤드에 대해 실제로 생각하지는 않았지만 간단한 Linq-to-Objects에 대해 그다지 많지 않을 것이라고 예상했습니다. CodingHorror 게시물은 Linq-to-SQL에 대해 이야기하고 있습니다. 여기서 쿼리를 구문 분석하고 SQL을 만들면 비용이 추가되는 것을 이해할 수 있습니다. Objects 공급자에게도 비슷한 비용이 있습니까? 그렇다면 선언적 또는 기능적 구문을 사용하는 경우 다른가요?