2010-08-05 2 views
1

두 개의 클래스 필드를 기반으로 정렬하는 CompareTo 메서드로 매우 간단한 SortedSet을가집니다. 이 컬렉션을 사용함에 따라이 콜렉션은 꽤 많이 (백만 + 객체) 얻을 수 있고 시간이 지남에 따라 커지고 성장할 수 있습니다. 나는 새로운 값이 이미 콜렉션에 존재 하는지를 결정하기 위해 간단한 Contains 메쏘드를 사용 해왔다. ...SortedSet <T> 대 Linq 쿼리 포함

학문적 연습으로 Linq (나는 상당히 새로운 것)를 사용하여 벤치마킹을하고있다. 내가 Linq에 대해 약간의 이해가 있다는 것은 확신 할 수 있습니다. 왜냐하면 저는 같은 성능에 원격으로 가까이 갈 수 없기 때문에 부족합니다. Linq 전문가가 속도를 낼 수있는 방법에 대한 지침을 줄 수 있는지 궁금합니다.

public int CompareTo(EntityHistoryChange other) 
{ 
    int recordIdComp = Recordid.CompareTo(other.Recordid); 
    int tableIdComp = Tablename.CompareTo(other.Tablename); 

    if (recordIdComp == 0 && tableIdComp == 0) 
     return 0; 
    else if (recordIdComp != 0) 
     return recordIdComp; 
    else 
     return tableIdComp; 
} 

간단한 목록에 해당 LINQ 쿼리

가 :

var handledChange = from thisChange in handledChanges 
        where thisChange.Recordid == recordId 
         && thisChange.Tablename == tableName 
        select thisChange; 

나는 결과는 나를 놀라게하지 말아야 가정

그래서 ... 목적은 다음과 같이 뭔가를 보이는 compareTo와 있습니다. ..

Linq Lookup on 18772 rows: 46 ms 
SortSet Lookup on 18772 rows: 3 ms 

그래서 문제는 무엇입니까? - 동일한 LINQ 메커니즘이 무엇입니까?

+0

Linq가 추가 한 추상화 계층을 고려하면 꽤 좋은 성능 인 것처럼 보입니다. –

답변

0

많은 LINQ 연산자가 IEnumerable<T> 이상의 인터페이스를 확인하여 사용합니다.

예. CountICollection<T>을 확인하고 전체 컬렉션을 반복하지 않고 Count 속성을 사용합니다. 이러한 것을 (벤치 마크가 아닌) 볼 수있는 유일한 방법은 일리노이 (또는 Refector 사용)를 살펴 보는 것입니다. 물론 구현은 새로운 .NET 버전 (SP 포함)으로 변경 될 수 있습니다. 예 : 아무런 의미를 갖지 않는, IEnumerable<T>을 .NET에서 R.5 CountICollection를 확인하지 못했지만, 그것은 Linq에이 SortedSet의 아닌 보는 것을 목적 때문에, 빨리이 같은 없을 것 4.

2

Linq에에 않지만, "나에게 물건의 목록을 줘." 당신은 Set'ness 전혀 활용하지 않을거야.

어떤 키가 SortedSet<T>으로 정렬 되나요? SortedSet.Contains를 통해 조회하는 것이 아니라면 테이블 이름을 확인할 수 있습니까?

0

LINQ는 주어진 작업에 올바른 데이터 구조의 사용을 대체하기위한 것이 아닙니다. 이러한 데이터 구조를 쉽게 처리 할 수 ​​있습니다. 데이터를 SQL 데이터베이스에 저장하는 경우 DB 성능을 향상시키기 위해 인텔리전트 인덱스를 사용해야합니다. 마찬가지로 LINQ to Objects를 사용하면 SortedSet<T>과 같은 데이터 구조를 적절히 활용해야합니다.

그래서 귀하의 질문에 대한 답은 다음과 같습니다

var exists = handledChanges.Any(c => c.Recordid = recordId && c.Tablename == tableName); 

을하지만 당신은 객체에 LINQ를 사용하는 경우, 이것은을 사용하는 것과 동일한 성능을 달성하지 않습니다 다음이 포함 시뮬레이션하기위한 LINQ 쿼리 방법이 될 것이다 빠른 검색을 위해 특별히 고안된 데이터 구조에 대한 메소드를 포함합니다. LINQ to SQL 또는 LINQ to Entities를 사용하는 경우 매우 신속하게 실행할 수있는 최적화 된 SQL 쿼리를 제공합니다.

그런데 메모리 내 콜렉션에서 더 빠른 조회를하는 것이 목표라면 사용자 정의 IEqualityComparer로 HashSet을 사용하는 것이 좋습니다. 그것의 Contains 메소드는 수백만 개의 객체 콜렉션과 마찬가지로 10 개의 콜렉션 에서처럼 오래 걸릴 것입니다.