Linq to Object 比普通 C# 慢 20 倍.有没有办法加快速度?



如果我只需要数组的最大[或3个最大的项目],我使用myArray.OrderBy(...(来完成。First(( [或 myArray.OrderBy(...(.Take(3(],它比调用 myArray.Max(( 慢 20 倍。有没有办法编写更快的 linq 查询?这是我的示例:

using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var array = new int[1000000];
for (int i = 0; i < array.Length; i++)
{
array[i] = i;
}
var maxResults = new int[10];
var linqResults = new int[10];
var start = DateTime.Now;
for (int i = 0; i < maxResults.Length; i++)
{
maxResults[i] = array.Max();
}
var maxEnd = DateTime.Now;
for (int i = 0; i < maxResults.Length; i++)
{
linqResults[i] = array.OrderByDescending(it => it).First();
}
var linqEnd = DateTime.Now;
// 00:00:00.0748281
// 00:00:01.5321276
Console.WriteLine(maxEnd - start);
Console.WriteLine(linqEnd - maxEnd);
Console.ReadKey();
}
}
}

在循环中对初始数组进行10次排序:

for (int i = 0; i < maxResults.Length; i++)
{
linqResults[i] = array.OrderByDescending(it => it).First();
}

让我们做一次

// 10 top item of the array
var linqResults = array
.OrderByDescending(it => it)
.Take(10)
.ToArray(); 

请注意,

for (int i = 0; i < maxResults.Length; i++)
{
maxResults[i] = array.Max();
}

只需重复相同的Max10次(它不会返回10热门项目(

最大方法时间消耗为 O(n(,最佳时间内排序为 O(n log(n(( 代码的第一个错误是您订购了 10 次,这是最糟糕的情况。您可以订购一次并像德米特里回答的那样选择其中的 10 个。 而且,调用 Max 方法 10 次不会给你 10 个最大值,只会给你 10 次的最大值。

但是,Max方法会迭代列表一次,并将 Max 值保留在单独的变量中。您可以重写此方法以迭代数组并在maxResults中保留10个最大值,这是获得结果的最快方法。

似乎其他人已经填补了Microsoft在 linq-to-object 中留下的效率差距: https://morelinq.github.io/3.1/ref/api/html/M_MoreLinq_MoreEnumerable_PartialSort__1_3.htm

相关内容

最新更新