2013-02-12 2 views
3

메모리 목록에서 실행되는 쿼리가 두 개 있다고 가정합니다.두 Linq 호출의 성능 비교

먼저 쿼리 (이용한 확장 방법)

var temp = listX.Where(q => q.SomeProperty == someValue);

번째 질의 :

var temp = from o in listX 
       where o.SomeProperty == someValue 
       select o; 

성능면에서 두 개의 쿼리 사이에 차이가; 그리고 있다면, 왜?

+0

왜 나 자신을 시험해 보지 않으셨습니까? –

+0

시도해 볼 수는 있지만 격리는 문제입니다 (어셈블리 출력을 검토 할 수도 있음). 둘 사이에 약간의 차이가있을 경우 예제를 작성하여 시도해도 작동하지 않을 수 있습니다. – daryal

답변

8

아니요, 전혀 차이가 없습니다. 컴파일러는 내부적으로 두 번째 버전을 첫 번째 버전으로 변환합니다.

는 C# 사양 (§7.6.12)의 상태 :

C# 언어 쿼리 표현의 실행 의미를 지정하지 않습니다. 오히려 쿼리 표현식은 쿼리 표현 패턴 (§7.16.3)을 따르는 메소드 중 호출 으로 변환됩니다. 은 특히, 질의 표현은, Where 이름 방법, Select, SelectMany, Join, GroupJoin, OrderBy, OrderByDescending, ThenBy, ThenByDescending, GroupBy의 호출로 번역하고, Cast .These 방법은 서명과 결과 유형의 특정을 할 것으로 예상된다 . 이러한 메서드는 개체의 인스턴스 메서드이거나 개체의 외부에있는 확장 메서드이며, 쿼리의 실제 실행을 구현할 수 있습니다.

쿼리 식에서 메서드 호출로의 변환은 형식 바인딩 또는 오버로드 해결이 수행되기 전에 발생하는 구문 매핑입니다. 번역은 의 구문 상 올바르다는 보장이 있지만 의미 상 올바른 C# 코드 을 생성하는 것은 아닙니다. 쿼리 식 변환 후 결과 메서드 호출은 일반 메서드 호출로 처리되며 메서드가 존재하지 않거나 인수 형식이 잘못되거나 메서드가 제네릭 인 경우 과 같은 오류가 차례로 나타날 수 있습니다. 형식 유추가 실패합니다.

+1

+1, 두 번째 옵션은 LINQPad를 사용할 때 쉽게 볼 수있는 첫 번째 옵션으로 컴파일됩니다. –

+0

@ 존 그래서 확장 메서드를 사용하면 오버 헤드가 전혀 추가되지 않는다고 가정 할 수 있습니까? – daryal

+0

@daryal : 물론. – Jon

4

차이는 없습니다. 같은 시간에 동일한 결과가 생성됩니다. 기본적으로 구문이 다른 동일한 코드입니다.

3

짧은 질문, 짧은 대답 :

차이는 없습니다. 두 구문은 모두 동일하며 다른 구문으로 작성되었습니다.

Query Syntax and Method Syntax에 대한 MSDN 설명서도 참조하십시오.