BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Abel Avram 关注 7 他的粉丝 ,译者 朱永光 关注 0 他的粉丝 发布于 2009年5月7日. 估计阅读时间: 8 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。
Ed Essey,微软并行计算团队的程序经理,记述了一些针对PLINQ的最新增强功能,很快要发布的.NET 4.0 Beta 1将会包含这些功能。他们涉及到:“With"运算符模式(Operators Pattern)、执行模式( Execution Mode)、取消操作(Cancellation)、部分代码的重构、性能提升。
 
在Beta 1中完整的PLINQ增强列表是:
  • With- 运算符模式
  • 执行模式
  • 取消操作
  • 自定义分区
  • 部分代码的重构
  • 合并选项
  • AsMerged又重新命名为AsSequential
  • 二元运算符现在需要两边都进行AsParallel
  • 性能提升
  • 删除了很少用到的运算符
“With”运算符模式。有4个新的方法:
  • e.AsParallel().WithDegreeOfParallelism
  • e.AsParallel().WithExecutionMode
  • e.AsParallel().WithCancellation
  • e.AsParallel().WithMergeOptions
执行模式。PLINQ把消耗相似资源过程调整为一个LINQ-to-Objects查询,特别地与内存消耗相关的东西。当一个PLINQ调用被认为会消耗太多资源,那么调用就连续地执行而不进行并行处理。是否转换到连续执行,是根据查询的具体情况来决定的。如下的查询就会被连续地执行:
  • 包含编入索引的Select,编入索引的Where,编入索引的SelectMany或者位置不在原始顺序上的ElementAt的查询。索引排序容易受到改变排序规则(如OrderBy)运算符和删除元素(如Where)运算符的影响。
  • 在已经偏离原始顺序的情况下(参看上面的条目),包含Take、TakeWhile、Skip、SkipWhile运算符的查询,。
  • 包含Zip、SequenceEquals的查询,除非其中一个数据源具有初始排序的索引,并且其他数据源是可索引的(比如一个数组或IList<T>)。
  • 包含Concat的查询,除非它是应用到可索引的数据源上。
  • 包含Reverse的查询,除非应用到可索引的数据源上。
为了强制并行执行,可以这样做:
e.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)
取消操作。并行运算可以如下面例子所示那样被取消:

var cts = new CancellationTokenSource();

var q = a.AsParallel().WithCancellation(cts.Token).Where(x=>Filter(x)).Select(x=>DoWork(x);

-- separate thread --

foreach (var e in q) { … }  // Statement 1

-- separate thread --

var l = q.ToList(); // Statement 2

-- separate thread --

cts.Cancel(); // this will attempt to cancel any in-flight queries,

// including both statements 1 and 2

自定义分区。Partitioner<TSource>、OrderablePartitioner<TSource>类和Partitioner工厂类提供了对数据如何分区的控制。
 
部分代码的重构。IParallelEnumerable、IParallelEnumerable<T>和IParallelOrderedEnumerable<T> 接口不再是接口而变为不可被扩展的抽象类了:ParalellQuery、ParalellQuery<TSource>和OrderedParallelQuery<TSource>。原因是,一开始他们就不会被扩展。
 
合并选项。“从AsMerged中移出了ParallelMergeOptions的处理。合并缓冲区现在通过WithMergeOptions方法来设定。”
 
AsMerged。AsMerged又重命名为曾经使用的和AsParallel类似的名称——AsSequential。
 
二元运算符。涉及两个数据源的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?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

深度内容

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT