二元运算符。涉及两个数据源的LINQ运算符需要两边都进行AsParallel。类似下面这样的运算:
a.AsParallel().AsOrdered().Zip(b, (x, y) => x*y);
可并行化为:
a.AsParallel().AsOrdered().Zip(b.AsParallel(), (x, y) => x*y);
或
a.AsParallel().AsOrdered().Zip(b.AsParallel().AsOrdered(), (x, y) => x*y);
影响到的运算符:Zip、Join、JoinGroupJoin、Concat、SequenceEqual、Union、Intersect、Except。
性能提升
1.保序流水线处理(Order-preserving pipelining)进行了合并——之前,在查询上一执行AsOrdered,就会在生成单个元素之前迫使整个查询执行。现在进行了优化,以便来自查询的元素只在MergeOptions值为Default(AutoBuffered)和NotBuffered的时候才生成。
2.针对未实现IList<T>的数据源,提升了分区正确性。
3.某些基于IList<T>或数组的查询具有更好的性能。
4.大块分区尺寸进行了调整——基于IList<T>和数组这样的数据源(也即非可索引的数据源)的查询,大块分区是最常见的分区方案(partitioning scheme)。随着越来越多的大块分区被访问,他们的尺寸也就不断增长。这是对如下两种情况的一个平衡:a)对小数据集进行查询,但在查询中要进行昂贵的委托处理,b)对大数据集进行查询,但在查询中不用进行昂贵的委托处理。
5.消除了有可能存在的错误共享情况,在某些情况下可以提升6倍的性能。
删除了很少用到的运算符。某些运算符是为了性能原因而创建的,但是并没有为LINQ提供任何性能好处,因而被移除了。哪些运算符要移除并未确定。
查看英文原文:What Is .NET 4.0 Beta 1 Going to Bring to PLINQ?