【问题标题】:linq foreach performancelinq foreach 性能
【发布时间】:2011-03-27 09:32:33
【问题描述】:

我正在迭代一个包含大约 1000 个元素的匿名类型。

这里的问题是,我的循环怎么可能需要将近 3 秒才能完成,而循环内部发生的事情却需要不到 1 毫秒。有一千个元素,我认为循环必须在秒内完成,而不是 3。

有没有办法让它迭代得更快?

// takes 1ms to complete
        var x = tt.Where(p => p.Methods.Count() > 0 && p.PerWeek != this.Project.WorkDaysCount && !p.IsManual);

// takes almost 3 seconds to complete
                    foreach (var item in x)
                    {
                        // do stuff that takes < 1 ms
                    }

【问题讨论】:

    标签: asp.net linq optimization


    【解决方案1】:

    两个直接的建议:

    • 不要使用p.Methods.Count() &gt; 0 - 这需要执行完整计数,即使您只需要知道是否有任何元素。请改用p.Methods.Any()
    • 不要在每次迭代时计算this.Project.WorkDaysCount。我们不知道那里发生了什么的细节,但它可能很昂贵。预先计算,并使用常数。

    这是改进后的查询代码:

    int workDaysCount = Project.WorkDaysCount;
    var x = tt.Where(p => p.Methods.Any() && 
                     p.PerWeek != workDaysCount &&
                     !p.IsManual);
    

    正如其他人所说,查询构造本身不需要任何大量时间的原因是它没有做任何实际工作。然而,知道这并不能让它变得更快,当然:)

    除此之外,我们还需要了解更多有关上下文的信息。这是 LINQ to Objects、LINQ to SQL 还是其他? tt是什么类型的?

    【讨论】:

    • 这是一个相当复杂的模块的一部分。 tt 是 group by 的结果,并基于某些标准构建子集合。Methods。它是对象的 linq。根据您的信息,我认为我可以进一步优化。谢谢!
    【解决方案2】:

    Linq 使用延迟执行。在有人使用返回的 IEnumerable 之前,您的 linq 查询实际上不会执行。您看到的执行时间是查询的结果,而不是 foreach。

    【讨论】:

      【解决方案3】:

      这是延迟执行。 写x.ToList();也需要3秒左右。

      【讨论】:

        【解决方案4】:

        您的 IEnumerable (x) 在您实现它之前不会被评估

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-22
          • 2012-01-03
          • 2014-05-16
          • 2011-08-08
          • 2011-07-16
          • 1970-01-01
          • 2010-11-05
          • 1970-01-01
          相关资源
          最近更新 更多