[C#]Array.Sort和List.Sort的委托版本比IComparer版本效率低

  这是List<T>.Sort的委托版本实现:

1 class List < T >
2 {
3 ...
4
5 public void Sort(Comparison < T > comparison)
6 {
7 if (comparison == null )
8 {
9 ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
10 }
11 if ( this ._size > 0 )
12 {
13 IComparer < T > comparer = new Array.FunctorComparer < T > (comparison);
14 Array.Sort < T > ( this ._items, 0 , this ._size, comparer);
15 }
16 }
17 }

  这是Array.Sort的委托版本:

1 class Array
2 {
3 ...
4 public static void Sort < T > (T[] array, Comparison < T > comparison)
5 {
6 if (array == null )
7 {
8 throw new ArgumentNullException( " array " );
9 }
10 if (comparison == null )
11 {
12 throw new ArgumentNullException( " comparison " );
13 }
14 IComparer < T > comparer = new FunctorComparer < T > (comparison);
15 Sort < T > (array, comparer);
16 }
17 }

  其中Array.FunctorComparer<T>的定义为:

1 internal sealed class FunctorComparer < T > : IComparer < T >
2 {
3 // Fields
4 private Comparer < T > c;
5 private Comparison < T > comparison;
6
7 // Methods
8 public FunctorComparer(Comparison < T > comparison);
9 public int Compare(T x, T y);
10 }

  即Array.Sort和List<T>.Sort内部都使用了一个叫Array.FunctorComparer<T>的适配器,来将委托版本转化为IComparer<T>版本的Sort实现。本来排序中的比较操作就是性能敏感的,C++中的std::sort甚至只因为比较运算内联的缘故就C中的qsort更快。这里的委托版本Sort比IComparer版本多了一层适配带来的函数调用开销,委托版本更慢也是情理之中。

  另外在对值类型排序时,使用IComparer<T>比IComparer快,实现IComparable<T>比IComparable快。快的原因是更少的装箱。

你可能感兴趣的:(compare)