[C#]Array.Sort和List<T>.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快。快的原因是更少的装箱。

posted @ 2011-07-04 18:05  Scan.  阅读(2792)  评论(2编辑  收藏  举报