.NET 4.0中的Array.Sort()发生了什么?TrySZSort()走了吗?

Hay*_*ach 5 .net sorting comparison performance

我想知道为什么下面的代码片段没有给出预期的结果?它对一个不太小的随机数组进行排序,并使用3种不同的方法.我期待速度如此:

  1. Array.Sort() - 我从.NET 2.0中回忆起使用本机TrySZSort函数的速度最快
  2. 使用自定义Comparer类降序排序
  3. 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(); 
}
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%.所以它仍然相当慢.

Ree*_*sey 5

所以,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)