技术开发 频道

.NET 4.0 Beta 1将为PLINQ带来些什么?

  二元运算符。涉及两个数据源的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?

0
相关文章