2010-02-27 2 views
7

LINQ to Objects 최적화 기술을 사용하고 있습니까? 아니면 야생에서 본 적이 있습니까?LINQ to Objects Optimization Techniques?

"yield foreach"와 다른 언어/컴파일러 최적화가 201x로 C#에 도착하기를 기다리는 동안 어디에서나 LINQ를 사용하여 성능에 미치는 영향을 줄이는 것이 가능합니다.

하나의 패턴은 특정 조합 자에 대한 사용자 지정 IEnumerable 구현을 만들어서 열거 형을 여러 번 다시 열거하지 않도록했습니다. 내가 몇 번을 발견했습니다

+0

"열거 형을 여러 번 다시 열거하지 않도록 특정 결합 자에 대한 사용자 지정 IEnumerable 구현 만들기"-> ToArray의 전술적 사용, 확실하게? –

+0

ToArray가 항상 답이되는 것은 아닙니다. 예를 들어 재귀 적 시나리오에서. –

답변

10

하나는 - 사용하지 않는 :

if (query.Count() > 0) 

...이 대신 사용

if (query.Any()) 

는 첫 번째 일치를 찾을 필요가 그 방법을 .

편집 : 은 개체에 대한 LINQ가 될 수 있지만 .NET 3.5에는 포함되지 않은 최적화에 대해 blog post I recently wrote에 관심이있을 수 있습니다.

또한, 당신이 x.Contains(y) 운영 및 x을 많이 할 거라면 것은, 당신은 아마에 x에서 HashSet<T>를 구축 고려해야한다 (즉, 이미 일부 최적화 수집을 할 수 없을거야) 기존 쿼리의 결과는 각 반복마다 선형 스캔 (x의 결과를 생성하는 쿼리 수행)을 피하십시오.

+0

훌륭한 팁입니다! –

+0

확실히 모든 것은 백작보다 훨씬 낫습니다. 방금 BCL 4를 분해했고 ElementAt가 이제 ILists에 맞게 최적화되었습니다. 이 경우 간단한 목록 [색인] 조회를 수행합니다. –

+0

방금 ​​BCL 4 Reverse()를 체크 아웃했는데 속도가 느립니다. 당신이 언급 한 것처럼 무작위 액세스 역 열거 형을 구현하는 것은 매우 사소한 일입니다. 방금 그렇게했고 상당히 빨라졌습니다. 그래서 이것을 내 트릭 가방에 넣을 것입니다. –