Hay*_*ach 5 .net sorting comparison performance
我想知道为什么下面的代码片段没有给出预期的结果?它对一个不太小的随机数组进行排序,并使用3种不同的方法.我期待速度如此:
代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
但奇怪的是,它给出了以下内容:
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. ...
Run Code Online (Sandbox Code Playgroud)
所以,lambda真的是最慢的.但是怎么回事,平原上升的Array.Sort不再快了?是吗,因为Array.Sort(T [],Comparer)已得到改进或者TrySZSort被删除了吗?还是我错过了什么?
(发布版本,没有调试,现在没有Reflector可用;))谢谢!
更新:根据@Reed Copsey的提示,lambda表达式不公平.我尝试将其更改为与比较器相同.速度上升了.Asc/lambda从55% - > 75%.所以它仍然相当慢.
所以,lambda真的是最慢的.但是怎么回事,平原上升的Array.Sort不再快了?是吗,因为Array.Sort(T [],Comparer)已得到改进或者TrySZSort被删除了吗?还是我错过了什么?
嗯,这里有两个问题.首先,这真的取决于你的构建和系统 -
在我的系统中,64位,Array.Sort() 是最快的,由显著量:
ascending took: 192 ms
descending took: 248 ms
desc lambda took: 326 ms
ascending took: 194 ms
descending took: 247 ms
desc lambda took: 326 ms
Run Code Online (Sandbox Code Playgroud)
在x86上,情况略有不同 - 但与您所显示的几乎没有相同的意义:
ascending took: 235 ms
descending took: 223 ms
desc lambda took: 325 ms
ascending took: 234 ms
descending took: 222 ms
desc lambda took: 325 ms
Run Code Online (Sandbox Code Playgroud)
在运行这些时间时,您是否连接了Visual Studio主机?如果在VS内运行,即使发布版本也会大大减慢(即:默认情况下为F5而不是Ctrl + F5).
另请注意,就lambda而言,您的测试并不完全公平.您应该使用相同的机制进行测试,这将是:
Array.Sort<double>(a, (x, y) => (x > y) ? -1 : 1);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1226 次 |
| 最近记录: |