結果
1000万のランダム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
を返します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
編集:上記のタイミングは5.9214729782462845
(Stopwatch
そしてTimeSpan
「ダニ」の異なる定義を持っている)の係数で低すぎます。ただし、ポイントには影響しません。