[C#]Array.Sort和List<T>.Sort的委托版本比IComparer版本效率低
2011-07-04 18:05
417 查看
这是List<T>.Sort的委托版本实现:
class List<T>
{
...
public void Sort(Comparison<T> comparison)
{
if (comparison == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
if (this._size > 0)
{
IComparer<T> comparer = new Array.FunctorComparer<T>(comparison);
Array.Sort<T>(this._items, 0, this._size, comparer);
}
}
}
这是Array.Sort的委托版本:
class Array
{
...
public static void Sort<T>(T[] array, Comparison<T> comparison)
{
if (array == null)
{
throw new ArgumentNullException("array");
}
if (comparison == null)
{
throw new ArgumentNullException("comparison");
}
IComparer<T> comparer = new FunctorComparer<T>(comparison);
Sort<T>(array, comparer);
}
}
其中Array.FunctorComparer<T>的定义为:
internal sealed class FunctorComparer<T> : IComparer<T>
{
// Fields
private Comparer<T> c;
private Comparison<T> comparison;
// Methods
public FunctorComparer(Comparison<T> comparison);
public int Compare(T x, T y);
}
即Array.Sort和List<T>.Sort内部都使用了一个叫Array.FunctorComparer<T>的适配器,来将委托版本转化为IComparer<T>版本的Sort实现。本来排序中的比较操作就是性能敏感的,C++中的std::sort甚至只因为比较运算内联的缘故就C中的qsort更快。这里的委托版本Sort比IComparer版本多了一层适配带来的函数调用开销,委托版本更慢也是情理之中。
另外在对值类型排序时,使用IComparer<T>比IComparer快,实现IComparable<T>比IComparable快。快的原因是更少的装箱。
class List<T>
{
...
public void Sort(Comparison<T> comparison)
{
if (comparison == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
if (this._size > 0)
{
IComparer<T> comparer = new Array.FunctorComparer<T>(comparison);
Array.Sort<T>(this._items, 0, this._size, comparer);
}
}
}
这是Array.Sort的委托版本:
class Array
{
...
public static void Sort<T>(T[] array, Comparison<T> comparison)
{
if (array == null)
{
throw new ArgumentNullException("array");
}
if (comparison == null)
{
throw new ArgumentNullException("comparison");
}
IComparer<T> comparer = new FunctorComparer<T>(comparison);
Sort<T>(array, comparer);
}
}
其中Array.FunctorComparer<T>的定义为:
internal sealed class FunctorComparer<T> : IComparer<T>
{
// Fields
private Comparer<T> c;
private Comparison<T> comparison;
// Methods
public FunctorComparer(Comparison<T> comparison);
public int Compare(T x, T y);
}
即Array.Sort和List<T>.Sort内部都使用了一个叫Array.FunctorComparer<T>的适配器,来将委托版本转化为IComparer<T>版本的Sort实现。本来排序中的比较操作就是性能敏感的,C++中的std::sort甚至只因为比较运算内联的缘故就C中的qsort更快。这里的委托版本Sort比IComparer版本多了一层适配带来的函数调用开销,委托版本更慢也是情理之中。
另外在对值类型排序时,使用IComparer<T>比IComparer快,实现IComparable<T>比IComparable快。快的原因是更少的装箱。
相关文章推荐
- C# 数组集合 <一>基本概念(Array&ArrayList&List<T>&SortList&LinkList的实现Code)
- C# List<T>.Sort排序
- [C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- C# List<>与Array性能比较
- C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)
- [C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- C# List<T>.Sort排序
- C# List<>与Array性能比较
- C#基础---IComparable用法,实现List<T>.sort()排序
- C#中Array与ArrayList与泛型数组 list<>的区别
- C# 中的集合(Array/ArrayList/List<T>/HashTable/Dictionary)
- 深入理解 c# 第一章 使用IComparer<Product>委托 对 List <Product> 进行排序
- C#基础教程之IComparable用法,实现List<T>.sort()排序
- C# List<>与Array性能比较
- [C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- C#基础---IComparable用法,实现List<T>.sort()排序
- C#基础教程之IComparable用法,实现List<T>.sort()排序
- [C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- [转]C# 中使用委托对List<>进行排序和筛选
- c#中List<>类的Sort()的几种形式