比较方法和比较类之间是否有任何性能差异?

时间:2013-03-20 13:30:14

标签: c# sorting generic-collections

之间的性能是否有任何差异
List<T>.Sort Method (Comparison<T>)

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

是否存在任何结构(软件架构)优势?

您何时使用比较方法而不是比较类,反之亦然?

编辑:

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

我的电脑上的性能差异约为1%。

似乎比较类更快。

2 个答案:

答案 0 :(得分:3)

不同之处在于第一个接受方法(匿名或非匿名),第二个接受比较器对象的实例。有时,定义复杂且可自定义的比较器类比在单个函数中编写所有内容更容易。

我更喜欢第一个用于一维中的简单排序,后者用于多维排序。数据网格。

使用比较器,您可以拥有通常可以帮助缓存的私有成员。这在某些情况下很有用(同样,在网格中显示的大型数据集的复杂排序中)。

答案 1 :(得分: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