Результаты
Используя список из 10 миллионов случайных int
(одно и то же семя каждый раз, в среднем 10 повторений):
listCopy.Sort(Comparer<int>.Default)
принимает 314ms.
Использование
sealed class IntComparer : IComparer<int>
{
public int Compare(int x, int y)
{
return x < y ? -1 : (x == y ? 0 : 1);
}
}
listCopy.Sort(new IntComparer())
принимает 716ms.
Некоторые варианты:
- Использование
struct IntComparer
вместоsealed class
: 771ms - Использование
public int Compare(int x, int y) { return x.CompareTo(y); }
: 809ms
Комментарии
Comparer<int>.Default
возвращает a GenericComparer<int>
. Согласно dotPeek, мы имеем:
internal class GenericComparer<T> : Comparer<T> where T : IComparable<T>
{
public override int Compare(T x, T y)
{
if ((object) x != null)
{
if ((object) y != null)
return x.CompareTo(y);
else
return 1;
}
else
return (object) y != null ? -1 : 0;
}
...
}
Очевидно, что это не должно быть быстрее моего варианта IntComparer
, используя CompareTo
.
Я не нашел ничего подходящего в ArraySortHelper<T>
, который кажется ядром List<T>.Sort
.
Я могу только догадываться, что JIT делает какую-то магическую специальную оболочку здесь (замените сортировки, которые используют Comparer<int>.Default
с помощью специальной реализации сортировки, которая не выполняет никаких вызовов IComparer<T>.Compare
или что-то подобное)?
EDIT: приведенные выше тайминги слишком малы в 5.9214729782462845
(Stopwatch
и TimeSpan
имеют другое определение "Tick" ). Однако это не влияет на точку.