.NET 4 Parallel.ForEach和PLINQ:他们可以压倒线程池并杀死应用程序性能吗?

时间:2012-03-25 03:59:31

标签: c# .net linq parallel-processing plinq

我在代码中使用的Parallel.ForEach和PLINQ越多,我得到的面孔和代码审查就越多。所以我想知道我有什么理由不在每个LINQ语句中使用极端的PLINQ吗?运行时是否能够足够聪明地开始产生如此多的线程(或者从线程池中消耗这么多线程),应用程序性能实际上会降低而不是改进?同样的问题适用于并行库。

我确实理解与线程安全和使用多线程的开销相关的含义。我也意识到并不是一切都有利于并行化。所有我想知道我是否应该停止捍卫我的方法,只是放弃这两件好事,因为我的同行认为我最好自己进行线程控制,而不是依靠.NET设施?

更新:请假设硬件足以满足使用多线程的先决条件。

3 个答案:

答案 0 :(得分:4)

这一切都归结为两件事:

  1. 与常规foreach相比,分割集合和同步线程所需的额外工作是否大于性能提升?

  2. 所有线程是否都会使用共享资源而成为瓶颈?

  3. 第二种情况的一个例子是对Parallel.ForEach语句的结果进行Linq to Sql。在这种情况下,如果您的结果来自数据库的速度非常慢,那么每个线程可能会花费更多时间等待数据处理而不是实际执行某些操作。

    请参阅:http://msdn.microsoft.com/en-us/library/dd997392.aspx

答案 1 :(得分:3)

设置可以使用的工作线程数.WithDegreeOfParallelism(N)

例如

var query = from item in source.AsParallel().WithDegreeOfParallelism(2)
            where Compute(item) > 42
            select item;

请参阅http://msdn.microsoft.com/en-us/library/dd997425.aspx

答案 2 :(得分:2)

当深入挖掘表现问题时,我认为最好的办法是......衡量,衡量和衡量。即使有人回答说PLINK很棒并且会提高你的应用程序的性能,你会相信它没有通过分析验证吗?虽然可能存在一般答案,但您无法在确切的情况下不遗余力地衡量性能。总体性能取决于很多事情,PLINK可以帮助一个案例而不是另一个案例。
我个人对PLINK的体验是,在将每个LINQ查询转换为PLINK后,响应时间会更好。负载很小,当负载在其最大值附近时没有差别。但我可以想象一下PLINK在巨大负载下会损害整体性能的情况。必须检查一下你自己的具体情况。
嗯......如果你想让别人相信你走的是正确的道路,还有什么比测量结果更好?