2013-03-20 15 views
2

비교 방법과 비교 클래스간에 성능 차이가 있습니까?

List<T>.Sort Method (Comparison<T>) 

List<T>.Sort Method (IComparer<T>)? 

합니까 어떤 구조 (소프트웨어 아키텍처) 혜택을 존재 사이의 성능 차이가 있습니까?

언제 비교 클래스 대신 비교 메소드를 사용합니까? 그 반대의 경우도 있습니까?

편집 :

List<T>.Sort Method (IComparer<T>)가 빠릅니다. 짐 Mischel 감사합니다!

성능 차이는 내 PC에서 약 1 %입니다.

비교 클래스가 더 빠른 것 같습니다.

+0

가 먼저 자신을 시도 했 : 기본 IComparer 구현에 대한 정보를 포함

그것에 대해 좀 더? [FAQ]와 [ask]을 읽어보십시오. –

+1

아마도 IComparer 메쏘드는 시간과 메모리를 필요로하는'IComparer '을 구현하는 객체의 실체화를 필요로합니다. 여러 클래스에 걸쳐 비교를 공유하고자한다면, 'IComparer '이 더 유연한 라우트가 될 것입니다. –

+0

@Soner Gönül : 그렇습니다. 내 자신의 경우 모두 성능을 확인할 수는 있지만 성능은 가장 먼저 생각할 수도 있지만이 상황에서 가장 중요한 질문은 아닙니다. 그것을 사용하는 것이 더 중요합니다. –

답변

2

내가 기억 하듯이 List.Sort(Comparer<T>)IComparer<T>을 인스턴스화 한 다음 List.Sort(IComparer<T>)을 호출합니다.

class SortComparer<T>: IComparer<T> 
{ 
    private readonly Comparison<T> _compare; 
    public SortComparer(Comparison<T> comp) 
    { 
     _compare = comp; 
    } 

    public int Compare(T x, T y) 
    { 
     return _compare(x, y); 
    } 
} 

public Sort(Comparison<T> comp) 
{ 
    Sort(new SortComparer(comp)); 
} 

그래서 그들은 정말 같은 일을하고 결국 :

그것은 다음과 같이 보입니다. 이 물건을 타임 아웃했을 때 (.NET 3.5에 돌아 왔을 때) Sort(IComparer<T>)은 모든 호출에 대해 추가 역 참조를 할 필요가 없었기 때문에 약간 빨랐습니다. 그러나 그 차이는 실제로 걱정할 정도로 크지 않았습니다. 이것은 가장 빠른 것을 수행하는 것이 아니라 코드에서 가장 잘 작동하는 것을 사용하는 경우입니다. Of Comparison and IComparer

+0

나는 내부 구현의 좋은 지식을 몰랐다. :) –

3

차이점은 첫 번째가 익명인지 아닌지를 허용하고 두 번째가 비교 객체의 인스턴스를 허용한다는 점입니다. 때로는 단일 함수 내에 모든 것을 작성하는 것이 아니라 복잡하고 사용자 정의 가능한 비교기 클래스를 정의하는 것이 더 쉽습니다.

하나의 차원에서 단순 정렬의 경우 우선하고, 다차원 정렬의 경우 후자를 선호합니다. 데이터 그리드.

비교자를 사용하면 캐싱에 도움이되는 개인 회원을 보유 할 수 있습니다. 이것은 특정 시나리오에서 유용합니다 (그리드에 표시된 큰 데이터 세트의 복잡한 정렬에서).

+1

이런 종류의 대답은 내가 기대하는 바입니다. 감사! –