2013-03-20 115 views
2

是否有比較方法和比較類有任何性能差異嗎?

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

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

不存在任何結構(軟件體系結構)利益之間在性能上有什麼區別?

您何時使用比較方法而不是比較類,反之亦然?

編輯:

List<T>.Sort Method (IComparer<T>)更快。感謝Jim Mischel!

我的電腦的性能差異大約爲1%。

看來,比較類是更快的。

+0

你有沒有嘗試過自己第一?請閱讀[常見問題]和[問] – 2013-03-20 13:32:21

+1

可以想象,'IComparer '方法需要實現一個實現'IComparer '的對象 - 這將涉及時間和內存。如果你想分享多個類別的比較,'IComparer '將是更靈活的路線。 – 2013-03-20 13:36:20

+0

@SonerGönül:是的,我可以在這兩種情況下檢查自己的表現,但在這種情況下,表現並不是最重要的問題,儘管你可以一開始就思考。如何使用它更重要。 – 2013-03-20 13:39:53

回答

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>)稍微快一點,因爲它不必在每次調用時都做額外的引用。但差距真的不足以擔心。這絕對是一種使用代碼中最好的方法,而不是最快的方法。

一點關於它,包括有關默認IComparer實現信息:Of Comparison and IComparer

+0

我不知道,內部實現的好的知識:) – 2013-03-20 13:51:34

3

區別在於第一個接受方法(匿名或不接受),第二個接受比較器對象的實例。有時候定義複雜和可定製的比較器類比單獨編寫一個函數更容易。

我更喜歡第一個用於簡單排序的一維,後者用於多維排序。數據網格。

使用比較器可以讓私人成員經常幫助緩存。這在某些情況下很有用(同樣,在網格中顯示的大型數據集的複雜排序中)。

+1

這種答案就是我所期望的。謝謝! – 2013-03-20 13:41:41