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

本文深入解析了C#中List<T>.Sort与Array.Sort方法的委托版本实现,解释了它们如何通过适配器(Array.FunctorComparer<T>)将委托转化为IComparer<T>版本的Sort实现,并讨论了这种实现方式带来的性能开销。文章还对比了在值类型排序时使用IComparer<T>与IComparable<T>的性能差异,强调了装箱操作对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  这是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快。快的原因是更少的装箱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值