2010-06-30 2 views
4

제목이 내 생각을 잘 묘사하고 있다고 생각하십시오 :)LINQ의 .Where()가 O (N)보다 빠를 수 있습니까?

최근에 많은 사람들이 LINQ에 맹세 한 것을 보았습니다. 또한 내가 최고라고 믿는 동안, 나는 또한 당신이 사실에 대해 혼동하지 말아야한다고 생각합니다. 대부분의 (모든?) IEnumerable 유형에서 성능이 그렇게 좋지는 않습니다. 나는 이것을 잘못 생각하고 있는가? 특히 큰 데이터 집합에서 Where()를 중첩하는 위치를 쿼리 하시겠습니까?

죄송합니다.이 질문이 다소 모호하면 LINQ를 사용할 때 "신중해야합니다"라는 생각을하고 싶습니다.

[편집] 그냥 명확하게 - 여기 객체 Linq에의 관점에서 생각하고 있어요 : 그것은 공급자에 따라 다릅니다

+1

나는 LINQ와 조심하는 것이 좋은 생각이라고 생각합니다. 당신이 그것을 알고 있지 않으면 열심히 당신을 물 수있는 미묘한 것들이 있습니다. – Skurmedel

답변

2

다음은 LINQ2Object에 대한 색인 생성을 지원하는 프로젝트입니다. 이것은 더 나은 asymptotic 행동을 제공해야합니다 : http://i4o.codeplex.com/

3

. Linq to Objects의 경우 O (n)이 될 것이지만 Linq to SQL 또는 Entities의 경우 Linq는이를 극복하기 위해 인덱스를 궁극적으로 사용할 수 있습니다. 객체의 경우 Where의 기능이 필요하면 어쨌든 O (n)이 필요할 것입니다. Linq 에 거의 대부분 함수 호출 때문에 더 큰 상수를가집니다.

+0

죄송합니다. Linq가 여기에있는 물건을 의미합니다. 어떻게 든 O (N)을 이길 수있는 IEnumerable 구현이 있다면 나는 생각하고 있었다. - 그러나 나는 그렇지 않다는 것을 짐작할 수있다. :) – cwap

+0

'IEnumerable' 객체는 어디서'Enumerable.Where'인가요? . 특별한 경우를 원한다고해도 O (n)을 이길 수있는 방법을 알지 못합니다. –

+0

AFAIK, IEnumerable은 GetNext() 및 Reset() 만 노출하는 GetEnumerator()를 정의합니다. 확장 메서드가 있습니다. 데이터 형식으로 작성된 누군가가 재정의하는 데 신경 쓰는지 여부는 알 수 없습니다. 내 짐작은 그런데. foreach가 변장 한 곳은 어디일까요? :) – cwap

3

사용 방법과 비교 대상에 따라 다릅니다.

foreache을 사용하여 많은 구현을 보았습니다. linq를 사용하면 훨씬 빨랐을 것입니다. 예 : 그들이 깨는 것을 잊었거나 너무 많은 물건을 돌려주기 때문에. 트릭은 항목이 실제로 사용될 때 람다식이 실행된다는 것입니다. 마지막에 First이 있으면 단 한번의 호출로 끝날 수 있습니다.

따라서 Where을 체인화하면 항목이 첫 번째 조건을 통과하지 못하면 두 번째 조건도 테스트하지 않습니다. 첫 번째 조건이 충족되지 않으면 오른쪽의 조건을 평가하지 않는 && 연산자와 유사합니다.

언제나 O (N)라고 말할 수 있습니다. 그러나 N은 소스에있는 항목의 수가 아니며 대상 세트를 만드는 데 필요한 최소 항목 수입니다. 그것은 꽤 좋은 최적화 IMHO입니다.

+0

사실,'.Where()'의 끝에'.First()'를 연결하는 것이 일치하는 한 O (N)보다 작을 것입니다. 마지막 요소 ... – cjk