我遇到了 LINQ 查询的性能问题,因此我创建了一个小型简化示例来演示以下问题。该代码采用小整数的随机列表并返回该列表,该列表被划分为几个较小的列表,每个列表的总数为 10 或更少。
问题是(正如我写的那样)代码需要 N 成倍增长。这只是一个 O(N) 问题。当 N=2500 时,代码在我的电脑上运行需要 10 多秒。
如果有人能解释发生了什么,我会非常感激。谢谢,马克。
int N = 250;
Random r = new Random();
var work = Enumerable.Range(1,N).Select(x => r.Next(0, 6)).ToList();
var chunks = new List<List<int>>();
// work.Dump("All the work."); // LINQPad Print
var workEnumerable = work.AsEnumerable();
Stopwatch sw = Stopwatch.StartNew();
while(workEnumerable.Any()) // or .FirstorDefault() != null
{
int soFar = 0;
var chunk = workEnumerable.TakeWhile( x =>
{
soFar += x;
return (soFar <= 10);
}).ToList();
chunks.Add(chunk); // Commented out makes no difference.
workEnumerable = workEnumerable.Skip(chunk.Count); // <== SUSPECT
}
sw.Stop();
// chunks.Dump("Work Chunks."); // LINQPad Print
sw.Elapsed.Dump("Time elapsed.");