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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.