如果你的某些类型(即自定义集合)中有一些枚举方法,那么使用LINQ语法或旧学校枚举(for / foreach)是否更好?
使用.NET 3.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,因为它具有简单的声明性质。