我想知道为什么下面的代码片段没有给出预期的结果?它对一个不太小的随机数组进行排序,并使用3种不同的方法。我期待的速度出来像这样:.NET 4.0中的Array.Sort()发生了什么? TrySZSort()消失了吗?
- 的Array.Sort() - 最快通过使用本地TrySZSort功能我从.NET 2.0
- 记得使用自定义比较器类 降序排序
- lambda表达式排序。
验证码:
class DescComparer : IComparer<double> {
// simple comparison
// (yes, its not exactly correct ...)
public int Compare(double x, double y) {
return (x > y) ? -1 : 1;
}
}
static void Main(string[] args) {
Stopwatch sw = new Stopwatch();
Random rand = new Random();
DescComparer comparer = new DescComparer();
double[] a = new double[1000000];
for (int r = 0; r < 20; r++) {
// init array
for (int i = 0; i < a.Length; i++) a[i] = rand.NextDouble();
sw.Restart();
Array.Sort(a);
sw.Stop();
Console.WriteLine("ascending took: {0} ms ", sw.ElapsedMilliseconds);
// init array
for (int i = 0; i < a.Length; i++) a[i] = rand.NextDouble();
sw.Restart();
Array.Sort<double>(a, comparer);
sw.Stop();
Console.WriteLine("descending took: {0} ms ", sw.ElapsedMilliseconds);
// init array
for (int i = 0; i < a.Length; i++) a[i] = rand.NextDouble();
sw.Restart();
Array.Sort<double>(a, (x,y) => -x.CompareTo(y));
sw.Stop();
Console.WriteLine("desc lambda took: {0} ms ", sw.ElapsedMilliseconds);
}
Console.Read();
}
但奇怪的是,它提供了以下:
ascending took: 514 ms
descending took: 537 ms
desc lambda took: 915 ms
ascending took: 511 ms
descending took: 492 ms
desc lambda took: 923 ms
ascending took: 511 ms
descending took: 483 ms
desc lambda took: 912 ms
ascending took: 511 ms
descending took: 485 ms
desc lambda took: 914 ms
ascending took: 518 ms
descending took: 485 ms
desc lambda took: 924 ms
... a.s.o. ...
因此,拉姆达真的是最慢的。但是,怎么样,平原上升Array.Sort不再更快?是否,因为Array.Sort(T [],Comparer)已被改进或TrySZSort被简单地删除?或者我错过了什么?
(发布版本,没有调试,目前没有Reflector可用;))谢谢!
更新: 根据@Reed Copsey的提示,lambda表达式不公平。我试图改变它与比较器相同。速度提高了。 Asc/lambda从55% - > 75%。所以它仍然相当慢。
我无法解释的性能结果,但看着反射,TrySZSort就不走了,并呼吁双方'Sort'和'排序'方法,但只有当比较器为空或默认时。 –
2012-02-20 18:46:23
@ Meta-Knight hm。有趣!所以看起来,管理方略微增加了一些。感谢您告诉! – 2012-02-20 18:53:03
是的,Array.Sort()在.NET 4中被重写。有几种分类器。当比较器出现故障时,你可能会得到一个不会陷入无限循环的环路。通过查看参考源中提供的注释源代码来追查它。 – 2012-02-20 19:32:15