2010-11-24 6 views
5

일부 수집 객체 (사전, 목록)에 대해 Linq를 사용했습니다. 따라서 기준에 따라 항목을 선택하려면 Linq 쿼리를 작성한 다음 linq 개체를 열거합니다. 그래서 내 질문은 Linq 주요 컬렉션을 반복하고 결과적으로 성능을 향상 제거하는 것입니다?LINQ는 루핑을 제거하여 성능을 향상합니까?

+8

LINQ는 마법이 아닙니다. –

+6

나는 누군가가 IEnumerable 을 한 번 모자를 벗기는 것을 보았다 ..... –

답변

8

절대적으로 아닙니다. LINQ to Objects는 내부적으로 루프합니다 - 그 밖의 방법으로 작동 할 수 있습니까? 한편

는 LINQ 보다 효율적으로 어떤 방법보다 당신이 걸릴 수 있습니다, 그것은 필요한 때만 세 번째 반면에 등

의 데이터를 스트리밍하여, 그것은 간접의 추가 레이어를 (포함하는 모든 iterators 등) 어떤 성능에 약간의 영향을 미칠 것입니다.

+10

아하! 나는 당신이 세 손을 가지고 있음을 알고있었습니다. –

+0

그래서 Linq-to-Objects는 비 전형적인 시나리오에서 비효율적이라는 것을 알았습니다. – NLV

+0

Oh gawd ... 다시는 그렇지 않습니다. @NLV, 어떻게 비효율적입니까? 코더 시간이 훨씬 더 많은 하드웨어 (렌탈 하드웨어조차도)와 Linq가 제공하는 시간 절약을 감안할 때, 보통 코드의 약 90 %가 성능에 중요하지 않다는 사실과 함께, linq는 비효율적이다. – spender

2

개연성이 없음. LINQ는 (잘하면) 읽을 수있는 코드를 간결하게 해줍니다.

백킹 데이터 구조가 검색보다 효율적인 검색 알고리즘을 지원하지 않는 한 표지 아래에 반복됩니다.

+0

"검색 데이터 구조가 검색보다 효율적인 검색 알고리즘을 지원하지 않는 한"- 일반적으로 해당 최적화가 해당 쿼리 연산자에 내장되어 있지 않으면 사실이 아닙니다. 예를 들어,'Skip'은 내가 아는 한 목록에 최적화되어 있지 않습니다. 현재 컬렉션에 LINQ to Objects 쿼리를 "후크"할 수있는 방법이 없습니다. – Ani

+2

내가 말한 것처럼 "제외 ..." –

+0

요점은 지원 데이터 구조가 지원할 수 있지만 LINQ to Objects가이 지원을 사용할 수 없다는 것입니다. – Ani

2

사실 LINQ to SQL을 사용하는 경우 LINQ가 결국 ado.net 스택 위에 추가 레이어이기 때문에 성능이 조금 떨어집니다.

개체에 linq를 사용하는 경우. linq에 의한 최적화가 있습니다. 가장 중요한 것은 생성 된대로 IEnumerable에서 결과를 산출하기 시작하는 "Yield"입니다. List를 채우고 함수가 반환 할 때까지 기다려야하는 표준 방식보다 낫습니다.

+0

LINQ to SQL : 두 쿼리가 동일하게 끝나는 한 true입니다. LINQ를 사용하여 개체를 필터링하여 모든 작업을 수행하려는 경우 속도가 느려질 수 있습니다. 개체에 대한 LINQ : 미리 채워진 목록이 이미있는 경우에는 빠릅니다. 모든 것은 실제로 장면 뒤에서 무슨 일이 일어나고 있는지에 달려 있습니다. –

1

쿼리를 직접 사용하면 여전히 전체 컬렉션을 반복합니다. 쿼리는 필터와 일치하는 요소 만 반환하기 때문에 모든 것을 볼 수 없습니다. 전반적인 성능은 아마도 관련된 모든 중첩 된 반복자 때문에 히트를 치기까지합니다. 쿼리 결과에서 ToList()를 호출하고이 결과를 여러 번 사용한 경우 성능면에서 더 나을 것이 좋습니다.