写点什么

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

  • 2009-05-06
  • 本文字数:1878 字

    阅读完需:约 6 分钟

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)。
  • 包含 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、OrderablePartitioner类和 Partitioner 工厂类提供了对数据如何分区的控制。

部分代码的重构。IParallelEnumerable、IParallelEnumerable和 IParallelOrderedEnumerable 接口不再是接口而变为不可被扩展的抽象类了:ParalellQuery、ParalellQuery和 OrderedParallelQuery。原因是,一开始他们就不会被扩展。

合并选项。“从 AsMerged 中移出了 ParallelMergeOptions 的处理。合并缓冲区现在通过 WithMergeOptions 方法来设定。”

AsMerged。AsMerged 又重命名为曾经使用的和 AsParallel 类似的名称——AsSequential。

二元运算符。涉及两个数据源的 LINQ 运算符需要两边都进行 AsParallel。类似下面这样的运算:

复制代码
a.AsParallel().AsOrdered().Zip(<b>b</b>, (x, y) => x*y);

可并行化为:

复制代码
a.AsParallel().AsOrdered().Zip(<b>b.AsParallel()</b>, (x, y) => x*y);

复制代码
a.AsParallel().AsOrdered().Zip(<b>b.AsParallel().AsOrdered()</b>, (x, y) => x*y);

影响到的运算符:Zip、Join、JoinGroupJoin、Concat、SequenceEqual、Union、Intersect、Except。

性能提升

1,保序流水线处理(Order-preserving pipelining)进行了合并——之前,在查询上一执行 AsOrdered,就会在生成单个元素之前迫使整个查询执行。现在进行了优化,以便来自查询的元素只在 MergeOptions 值为 Default(AutoBuffered)和 NotBuffered 的时候才生成。

2,针对未实现 IList的数据源,提升了分区正确性。

3,某些基于 IList或数组的查询具有更好的性能。

4,大块分区尺寸进行了调整——基于 IList和数组这样的数据源(也即非可索引的数据源)的查询,大块分区是最常见的分区方案(partitioning scheme)。随着越来越多的大块分区被访问,他们的尺寸也就不断增长。这是对如下两种情况的一个平衡:a)对小数据集进行查询,但在查询中要进行昂贵的委托处理,b)对大数据集进行查询,但在查询中不用进行昂贵的委托处理。

5,消除了有可能存在的错误共享情况,在某些情况下可以提升 6 倍的性能。

删除了很少用到的运算符。某些运算符是为了性能原因而创建的,但是并没有为 LINQ 提供任何性能好处,因而被移除了。哪些运算符要移除并未确定。

查看英文原文: What Is .NET 4.0 Beta 1 Going to Bring to PLINQ?

2009-05-06 20:412123
用户头像

发布了 254 篇内容, 共 71.3 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

【高并发】解密导致并发问题的第三个幕后黑手——有序性问题

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

微信朋友圈的高性能复杂度

哈喽

「架构实战营」

Module Federation在客服工单业务中的最佳实践

得物技术

前端 Module 模块 iframe Federation

HertzBeat入GVP啦,并 v1.0.beta.7 发布,易用友好的云监控系统

TanCloud探云

开源 APM angular java;

预约中,2022京东云产业融合新品发布会线上开启

京东科技开发者

云计算 京东云 产品发布会 直播预约

圆桌派来啦!与行业大咖聊聊Dapr的发展与实践

行云创新

云原生 dapr

互联网的下一站,大概率是能源

脑极体

机器人流程自动化评估体系全面助力垂直行业智能化转型

王吉伟频道

RPA 机器人流程自动化 信通院

后端开发【一大波干货知识】定时器方案红黑树,时间轮,最小堆

Linux服务器开发

定时器 后端开发 红黑树 时间轮 Linux服务器开发

智能化时代的数据集成技术革新

Apache SeaTunnel

大数据 开源 数据同步 Meetup Apache SeaTunnel

PLG公司的机遇和挑战

LigaAI

SaaS LigaAI PLG

EMQ 映云科技为抗疫项目提供全托管 MQTT 云服务免费使用

EMQ映云科技

物联网 IoT mqtt emq 抗疫

中国SaaS的增长真相|ToB大师课

ToB行业头条

博睿数据首批加入云科通明湖生态联盟,赋能信创生态谋未来

博睿数据

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

crudapi

oracle 零代码 API crud 增删改查

京东运动露营活动亮相首钢园,精彩持续整个四月

科技新消息

我真不信,这年头还有人能懂SpringBoot的ClassLoader加载机制

Java工程师

Java spring 程序员 科技

数字产业化快于产业数字化?

BeeWorks

netty系列之:netty中的核心解码器json

程序那些事

Java Netty 程序那些事 4月月更

足不出户,搞定交付——独家交付秘籍(第二回)

阿里巴巴云原生

linux之ssh命令

入门小站

Linux

适合中小企业的知识库软件有哪些?

小炮

知识管理

【Zeekr_Tech】汽车软件敏捷开发和分支管理

Zeekr_Tech

敏捷开发 智能驾驶

Apache flink - PartitionNotFoundException

GeekYin

flink 消费 kafak 错误排查

领域驱动设计(DDD)靠谱么?

架构精进之路

DDD 4月日更 4月月更

《数字经济全景白皮书》Z世代用户洞察篇(1)重磅发布!

易观分析

Z世代

提升职场竞争力!低代码开发师(高级)认证发布

一只大光圈

低代码 数字化 钉钉宜搭 宜搭

在线XML转JSON工具

入门小站

工具

软件开发中的风险如何处理?

源字节1号

微信小程序 软件开发

.NET 4.0 Beta 1将为PLINQ带来些什么?_.NET_Abel Avram_InfoQ精选文章