2013-03-20 209 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