【问题标题】:LINQ to Objects Optimization Techniques?LINQ to Objects 优化技术?
【发布时间】:2010-02-27 16:45:11
【问题描述】:

您使用或见过哪些 LINQ to Objects 优化技术?

在等待“yield foreach”和其他语言/编译器优化在 201x 中出现在 C# 中的同时,我对尽一切可能减少在任何地方使用 LINQ 的性能问题感到很有趣。

到目前为止,我看到的一种模式是为特定组合器创建自定义 IEnumerable 实现,这样可枚举就不会被重新枚举多次。

【问题讨论】:

  • “为特定的组合器创建自定义的 IEnumerable 实现,这样枚举器就不会被重新枚举多次” --> 对ToArray 的战术使用,确定吗?
  • ToArray 并不总是答案。例如在递归场景中。

标签: performance optimization linq-to-objects


【解决方案1】:

我发现了几次 - 不要使用:

if (query.Count() > 0)

...改用这个:

if (query.Any())

这样它只需要找到第一个匹配项。

编辑:您可能还对blog post I recently wrote 感兴趣,该blog post I recently wrote 了解可能在 LINQ to Objects 中但不在(或不在 .NET 3.5 中)的优化。

此外,如果您要执行大量 x.Contains(y) 操作,而 x 是现有查询的结果(即它还不是一些优化的集合),您可能应该考虑构建一个 @ 987654326@ from x 以避免在每次迭代时进行线性扫描(执行查询以产生 x 的结果)。

【讨论】:

  • 当然 Any 比 Count 好得多。我刚刚反汇编了 BCL 4,ElementAt 现在针对 ILists 进行了优化;在这种情况下,它会进行简单的 list[index] 查找。
  • 我刚刚检查了 BCL 4 Reverse(),它也很慢。正如您提到的,实现随机访问反向枚举非常简单。我只是这样做了,而且速度明显更快。所以我会把这个包含在我的技巧包中。
  • 您可能想查看我在 Extensia 中应用的优化和技巧:extensia.codeplex.com;它在任何地方都使用 LINQ to Objects,并包含一个混合序列/列表类型,用于对枚举进行缓冲访问。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多