gpt4 book ai didi

.net - .NET 4.0 中的 Array.Sort() 发生了什么? TrySZSort() 消失了吗?

转载 作者:行者123 更新时间:2023-12-02 01:42:48 31 4
gpt4 key购买 nike

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

  1. Array.Sort() - 使用 native TrySZSort 函数最快,我记得在 .NET 2.0 中
  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();
}

但奇怪的是,它给出了以下内容:

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. ...

所以,lambda 确实是最慢的。但为什么普通的升序 Array.Sort 不再更快了呢?是因为 Array.Sort(T[], Comparer) 已得到改进,还是 TrySZSort 只是被删除了?或者我错过了什么?

(发布版本,无调试,目前没有可用的反射器;))谢谢!

更新:根据@Reed Copsey 的提示,lambda 表达式是不公平的。我尝试将其更改为与比较器相同的值。速度加快了。 Asc/lambda 从 55% -> 75%。所以它仍然慢得多。

最佳答案

So, the lambda really is slowest. But how comes, the plain ascending Array.Sort is not faster anymore? Is it, because Array.Sort(T[], Comparer) has been improved or has TrySZSort simply been removed? Or did I miss something?

嗯,这里有两个问题。首先,这实际上取决于您的构建和系统 -

在我的 x64 系统上,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

在 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

当你运行这些计时时,你是否连接了 Visual Studio 主机?如果您在 VS 中运行(即:默认情况下使用 F5 而不是 Ctrl+F5),即使是发布版本也会显着变慢。

<小时/>

另请注意,就 lambda 而言,您的测试并不完全公平。您应该使用相同的测试机制,即:

Array.Sort<double>(a, (x, y) => (x > y) ? -1 : 1);

关于.net - .NET 4.0 中的 Array.Sort() 发生了什么? TrySZSort() 消失了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9366450/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com