【发布时间】:2020-04-01 09:44:36
【问题描述】:
如果我只需要数组的最大值 [或 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();
}
}
}
【问题讨论】:
-
var linqResults = array.OrderByDescending(it => it).Take(10).ToArray(); -
获得最大值是 O(n),而排序可能是 O(n log(n))。因此,不要排序以获得最大值。
-
为什么当它是array.Max()时你认为你没有使用Linq。您在两者中都使用了 Linq,只是以更长的方式执行其中一个。
-
请阅读 Speed Rant:ericlippert.com/2012/12/17/performance-rant
-
Linq-to-Sql 我想优化为不对整个表进行排序,然后只从中取出一项。这就是为什么我认为 Linq-to-objects 足够聪明,不会对整个数组进行排序。
标签: c# linq linq-to-objects