结果
使用 1000 万个随机int
s 的列表(每次相同的种子,平均 10 次重复):
listCopy.Sort(Comparer<int>.Default)
需要314 毫秒。
使用
sealed class IntComparer : IComparer<int>
{
public int Compare(int x, int y)
{
return x < y ? -1 : (x == y ? 0 : 1);
}
}
listCopy.Sort(new IntComparer())
需要716 毫秒。
一些变化:
- 使用
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
对“滴答声”有不同的定义)。不过不影响重点。