2013-05-18 2 views
0

나는 나 자신이 흐린 토요일 아침 생각을 앉아 : 직관적conjuncted 조건과 multiple Where 메서드 호출간에 차이가 있습니까?

IEnumerable<SomeType> 
    someThings = ..., 
    conjunctedThings = someThings.Where(thing => thing.Big && thing.Tall), 
    multiWhereThings = someThings 
    .Where(thing => thing.Big).Where(thing => thing.Tall); 

, 나는 conjunctedThings없이보다 느린 multiWhereThings을 계산하지만 실제로는 일반적인 경우의 차이가 될 것이라고 말하고 싶지만?

큰 물건과 큰 소리가 나면 공유에 따라 계산이 다르게 진행될 수 있지만 그 부분을 무시하고 싶습니다.

고려해야 할 다른 속성이 있습니까? 예 : 열거 형 또는 다른 것의 유형?

+1

그것은 _ "..."_에 달려 있습니다. 예를 들어 Entity Framework를 살펴보십시오. 열거자를 호출 할 때 모든 조건을 가진'Where' 또는 조건마다'Where'를하든 모든'Where' 's는 하나의 SQL WHERE으로 압축 될 것입니다. – CodeCaster

+0

@CodeCaster 감사합니다. 내가 언급 한 것 이외의 의존성 주위에 몇 줄을 그리는 데주의해야합니까? –

+2

"Conjuncted"(굉장한 단어 btw)'Where'와'Select' 쿼리는 LINQ to Objects에 의해 최적화됩니다. 성능 문제가 발생할 때마다 가장 좋은 방법은 ** 스톱워치를 꺼내 두 가지 방법으로 시도하는 것입니다 **. 그럼 알게 될거야. 여기서 얻은 답은 추측입니다. 실적 질문이있을 때 측정을 대신 할 수는 없습니다. –

답변

1

일반적으로 MultiWhere는 더 느립니다. 더 많은 항목을 처리하고 더 많은 람다를 호출해야합니다.

0

someThingsn 항목이 포함되어있는 경우, 그리고 mn 번 호출 conjucated-것들에 대한 람다 Big있는 동안 다라고 n+m 배의 람다. 두 시퀀스의 사용자가 모두를 내용으로 반복하려는 경우에는 true입니다. Where 메서드는 내부적으로 yield return을 수행하므로 컬렉션 사용자에 따라 반복 횟수가 줄어들 수 있습니다. 즉 위의 수치는 최악의 추정치입니다.

+0

답장을 보내 주셔서 감사합니다. 이 특별한 고려 사항은 이미 내 질문에 포함되어 있음을 지적하겠습니다 (분명히 알 수 있음). 당신이 말한 것처럼, 빅과 톨의 점유율은 분명히 영향을 미칩니다. 더 무엇? –

관련 문제