結果
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「ダニ」の異なる定義を持っている)の係数で低すぎます。ただし、ポイントには影響しません。