【问题标题】:C# LINQ Performance, How can I avoid It?C# LINQ 性能,我该如何避免它?
【发布时间】:2015-12-04 23:03:05
【问题描述】:

我有这个包含数百万行的scheduler.PageResults 代码。

var  AllNonHTMLPages = scheduler.PageResults
                         .Where(p => (p.SkipReason & SkipReasonEnum.NoHTML) == SkipReasonEnum.NoHTML);
Console.WriteLine("# All Non HTML Pages: {0}", AllNonHTMLPages.Count());
foreach (PageData page in AllNonHTMLPages) { Console.WriteLine("Non HTML Page: {0}", page.Url); }

foreach (PageData page in scheduler.PageResults
        .Where(p => p.SkipReason.IsFlagSet(SkipReasonEnum.None))
        .OrderByDescending(p => p.IndexPath.Length))
{
   .....
}

Roslyn Contributing Code表示

  • 避免使用 LINQ。
  • 避免在编译器热路径中分配:
  • 避免对没有结构枚举器的集合使用 foreach。 考虑使用对象池。编译器中有很多对象池的用法,看一个例子。

我知道 LINQ 很慢。在没有 Linq API 的情况下进行优化的一些想法?

【问题讨论】:

  • “我知道 LINQ 很慢” - Roslyn 团队并不是建议没有人使用 LINQ,只是它在 Roslyn 中不合适。不幸的是,我们几乎不知道您看到了什么性能,或者scheduler.PageResults 来自哪里......您需要向我们提供更多信息。

标签: c# performance linq


【解决方案1】:

我发现,当行中有大量数据/列时,使用 Linq 并循环遍历大量对象 (>5000) 时,速度很慢。因此,如果您可以访问数据库并且可以在那里进行操作,您将获得更快的性能数量级。此外,我从未实现过它(编写 TSQL),但是您可以购买/获取包来构建对象的内存索引以加快速度。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2013-07-24
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2011-04-15
    相关资源
    最近更新 更多