[Mono-bugs] [Bug 351638] Most Array.Sort<T>() overloads call Array.Sort<K, V>() to get their work done

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Tue Mar 4 09:40:33 EST 2008


https://bugzilla.novell.com/show_bug.cgi?id=351638

User juraj at hotfeet.ch added comment
https://bugzilla.novell.com/show_bug.cgi?id=351638#c2





--- Comment #2 from Juraj Skripsky <juraj at hotfeet.ch>  2008-03-04 07:40:32 MST ---
Created an attachment (id=198530)
 --> (https://bugzilla.novell.com/attachment.cgi?id=198530)
patch implementing proper argument checking and performance enhancements

The attached patch implements proper argument checking and various performance
enhancements. Using qsort<K,V> methods for Sort<T> turned out not to be a
bottleneck. Instead the inner-most loops in qsort had to be optimized:

while (low < high0 && compare (keys.GetValueImpl (low), objPivot, comparer) <
0)
    ++low;
while (high > low0 && compare (objPivot, keys.GetValueImpl (high), comparer) <
0)
    --high;


Changes:
========

- Sort (...) without IComparer param call Sort (..., (IComparer)null) siblings
- Sort (keys, items,...) with items == null call Sort (keys, ...) siblings 

- Sort (..., IComparer) methods do argument checking only, call SortImpl
- SortImpl methods do the real work (via combsort/sortNulls+qsort)

- add sortNulls(keys, items, low, high, bool ensureComparable) methods:
  - moves nulls to beginning of array
  - ensures that all non-null items implement IComparable/IComparable<T>
  - returns new "low" value (i.e. index of first non-null item)

- optimize qsort by employing multiple, faster copies of inner-most loop:
  - for case "comparer != null"
  - for case "pivot is IComparable<T>"
  - for case "pivot is IComparable"
- remove compare methods as the inner loops do their work


Performance improvements:
========================
15-20%  Array.Sort(object[]) (non-generic, array contains boxed ints)
25-30%  Array.Sort<T>(T[])
10-15%  Array.Sort<T>(T[], IComparer<Dummy>) (T being a struct)


All unit tests pass.
Please review.


-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list