2009-06-10 154 views
2

当您在某些类型(即自定义集合)中使用某些枚举方法时,最好是使用LINQ语法还是仅使用旧式枚举(for/foreach)?LINQ vs常规枚举

使用.NET 3.5是给定的。

我问这是为了获得最大的性能和可读性。该应用程序也被设计为并行。

你会喜欢哪一个?

回答

3

如果您绝对必须扭亏为盈,那么一个for/foreach循环很难提高效率。但是,如果您要追求平行性和可读性,那么在我的书中,Enumerable<T>扩展方法和LINQ获胜。

+1

谢谢,与平原LINQ我会得到并行执行?或者你的意思是PLINQ? – 2009-06-10 17:38:55

+0

你必须为我们PLINQ。 – mfawzymkh 2009-06-12 07:41:58

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(); 
} 

我认为(虽然我没有亲自这个基准测试),编译器优化出小函数调用,所以性能不应该是noticably不同。

2

我几乎总是喜欢在我的集合中使用LINQ而不是标准循环结构,但并行化方面稍微改变了一些事情。

如果您打算使用.NET 4.0,并行结构(特别是使用Parallel.For)将在并行化方面击败PLINQ,只要您事先知道计数。 PLINQ中的分区器做得很好,但是它们的用途非常普遍,并且如果事先已知计数,则无法与可用的分区策略相匹配。这会使Parallel.For当它可用时胜过PLINQ。

+0

谢谢里德。我不知道Parallel.For当你知道伯爵时更好。怎么样Parallel.Foreach(不知道是否有一个)。 – 2009-06-10 19:08:51

2

LINQ to Objects性能是一件混杂的事情。由于它涉及大量的间接调用(每个lambda都是一个),它有时会比较慢,有时(当lambda捕获并使用外部作用域的变量时)是它的3-4倍。而且,不,编译器(不论是C#还是JIT)都不会优化它 - 它不能内联虚拟方法调用,这就是通过代理有效调用的内容。所以如果你严格要求表现的话,在任何情况下,foreach都会略微更快。

PLINQ可以缓解这种差异,但请注意,惩罚足够重要,您可能需要4个内核才能与之匹配。另一方面,它会随着内核数量的增加而增加,而普通的内存不会。

2

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