2013-12-17 59 views
7

最近我对Linq和Plinq做了一些测量。 我看不出哪种情况对Plinq有实质性的好处。PLINQ有什么真正的好处?

我发现很多例子,如:

Enumerable.Range(0, 10000).AsParallel().ForAll(_ => Thread.Sleep(50000)); 

这是完全无用的例子,因为它可以用10000程度parallized是的话会快10000倍,但它的业务是罕见应用程序循环10000次并进行“IO作业”。

如果有人可以提一个例子,请发帖。

Plinq仅适用于Linq to Objects和Linq to XML。 不建议在运行于Web服务器的应用程序中使用它(它有自己的线程管理)。因此,我们的机会被削减为拥有多个核心的桌面应用程序。

通常我会写几分之一秒内连续运行的linq查询。如果我将其并列化,它确实会平行运行,那么速度会更快,但是谁在乎呢? 我认为它还是够快的。最终用户不会看到任何区别。

我可以想象一个例子,当有人从数据库获取所有数据并在内存中运行查询时。那么也许它是有用的,但它是一个错误的设计。

TPL是异步编程的好东西,但我仍然不确定Plinq是一个有用的工具。

有没有人有积极的经验呢?

+0

*“不要认为并行总是更快”* ...您需要查看[PLINQ的潜在缺陷](http://msdn.microsoft.com/en-us/library/dd997403%28v= vs.110%29.aspx)! –

+0

谢谢,我已经看过:) – speti43

+0

没有必要修复什么不坏。 PLINQ对于多核计算机上的大数据很有意义。 –

回答

7

的关键场景中,你从PLINQ得到的好处是这样的:

int[] src = Enumerable.Range(0, 100).ToArray(); 
var query = src.AsParallel() 
       .Select(x => ExpensiveFunc(x)); 

而且你得到真正的实惠。

有关何时有用的更多详细信息,请参阅文章here

例如,我试图评估昂贵的迭代数值方法,以便从一组X点计算一系列Y值以进行绘图时,我已经看到了好处。

+0

你有没有写过这样的代码?理论上我理解PLINQ的好处,但我无法想象ExpensiveFunc的实现,但我仍然认为这是错误的设计。 ExpensiveFunc应该在并行速度上快得多? – speti43

+3

是的,我有。我使用的是24核心机器,并试图计算1000个数据点,每个数据点需要大约200毫秒的数值抖动才能单独计算。处理时间从大约3分钟缩短到不到15秒,而且我的CPU在大多数内核中都能很好地工作。 PLINQ不是一个神奇的解决方案,但在某些情况下它可以带来真正的好处。 (就我而言,ExpensiveFunc中的代码正在进行迭代矩阵乘法以计算半导体器件仿真的离散点电压) – Baldrick

+0

是的,这是有道理的。谢谢! – speti43

0

尝试做它的数据大得多peice的或更复杂的任务

_objects.AsParallel().Select(ConvertObject); 

bool ConvertObject(object item) 
{ 
//some long running task 
} 

我使用PLINQ数个数据仓库的ETL,因为它可以快速编写和维护方便(在成本或整体表现)

我假设这里的商业案例是发展速度。