LINQ vs常规枚举

时间:2009-06-10 17:32:16

标签: c# .net linq performance

如果你的某些类型(即自定义集合)中有一些枚举方法,那么使用LINQ语法或旧学校枚举(for / foreach)是否更好?

使用.NET 3.5是给定的。

我要求这样做以获得最佳性能和可读性。该应用程序也设计为并行。

你赞成哪一个?

5 个答案:

答案 0 :(得分:6)

Linq查询可以使用PLinq(内置于.net 4)

轻松并行化

我个人觉得Linq更容易阅读,但这取决于你作为开发者。

foreach (var item in collection)
{
    if (item.Value == SomeOtherValue)
        performSomeProcessing();
}

VS

foreach(var item in collection.Where(a => a.Value == SomeOtherValue))
{
    performSomeProcessing();
}

我认为(虽然我没有亲自对此进行基准测试)编译器优化了小函数调用,因此性能不应该明显不同。

答案 1 :(得分:3)

如果你绝对必须将每一次性能降低,那么for / foreach循环很难超越效率。但是,如果你想要并行性和可读性,Enumerable<T>扩展方法和LINQ在我的书中获胜。

答案 2 :(得分:2)

我几乎总是倾向于在我的集合中使用LINQ而非标准循环结构,但并行化方面稍微改变了一些。

如果您计划使用.NET 4.0,并行构造(特别是使用Parallel.For)将在并行化方面击败PLINQ,前提是您事先了解计数。 PLINQ中的分区程序做得很好,但是它们是非常通用的,并且如果预先知道计数,则无法匹配可用的分区策略。这将使Parallel.For在可以使用时优于PLINQ。

答案 3 :(得分:2)

LINQ to Objects性能是一个复杂的事情。因为它涉及许多间接调用(每个lambda是一个),所以它更慢,有时(当lambda捕获并使用来自其外部范围的变量时)3-4倍。而且,不,编译器(无论是C#还是JIT)都不会优化它 - 它不能内联虚拟方法调用,这就是通过委托有效调用的内容。因此,如果您严格要求性能,foreach在任何情况下都会稍微快一点。

PLINQ可以缓解差异,但请注意,惩罚非常重要,您可能需要4个核心来匹配它。另一方面,它将随着核心数量的增加而扩大,而普通foreach则不会。

答案 4 :(得分:2)

这取决于 - 您的迭代是否有副作用?如果是这样,我会避免使用任何形式的LINQ,否则使用LINQ和PLINQ,因为它具有简单的声明性质。