2010-10-03 76 views
4

运行嵌套的PLINQ查询是否存在问题?嵌套并行查询

例如:

//Contains roughly 7000+ elements 
mycollections.AsParallel().ForAll(x => { 

    //contains 12 elements 
    anothercollection.AsParallel().ForAll(y => { 
    //download some data from the web and parse it 
    }); 
}); 

回答

6

有使用嵌套查询没有根本性的问题,所以你一定能做到这一点,PLINQ将尝试尽最大努力尽可能有效地并行的代码。然而,这可能是一件需要考虑的事情,如果你想获得最佳性能,你一定要进行一些测量。

最佳选择取决于两个集合中的元素数量以及运行处理所需的时间。

  • 如果外部收集足够小,那么你就需要内部循环了,所以您为并行化创造足够的潜力(产生足够PLINQ任务,以便它可以巴伦斯执行)

  • 如果外部集合包含大量元素,那么内部循环可能是不必要的,因为单个外部循环足以为PLINQ提供足够的空间用于并行化。事实上,内环可能只增加开销(不过,从我的经验,这种情况只能用非常大量元素)

另外,如果你要并行只有一个回路,它应该是外面的一个。通过这种方式,所有工作都可以一次拆分,并且只会发生一次并行开销。