写点什么

.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:411699
用户头像

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

关注

评论

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

低代码实现探索(十一)流程中的动作执行器

零道云-混合式低代码平台

HarmonyOS(鸿蒙)——滑动事件之上下左右滑动

李子捌

28天写作 21天挑战 鸿蒙开发 12月日更

百度智能云 AI 公有云服务市场,连续五次第一!

百度大脑

人工智能

记录与 Electron 的第一次亲密接触

何佩弦

跨平台 Electron

如何让TiDB在云上智能运维 (TiDB Hackathon 赛题)

如果迎着风就飞

云原生 operator TiDB Operator 存储上云

软件设计之非功能性

xcbeyond

软件设计 28天写作 12月日更 非功能性

从AI前沿到科技自立:百度大脑的风向标意义

脑极体

性能分析之Linux系统平均负载案例分析

zuozewei

Linux 性能分析 12月日更

为什么?为什么要先问目的?(27/28)

赵新龙

28天写作

Dubbo 框架学习笔记十五

风翱

dubbo 12月日更

过冬

搬砖的周狮傅

随笔杂谈

基于流程管理,提高工作质量和效率

流程管理

第一财经年终总结

石云升

读书笔记 28天写作 12月日更

盘点2021(一)

圣迪

复盘 盘点 2021

性能即天元:vivo S12的落子与棋局

脑极体

26《重学JAVA》--网络编程之Socket类

杨鹏Geek

Java25周年 28天写作 12月日更

绘制监控页面的一些最佳实践

耳东@Erdong

最佳实践 监控 28天写作 12月日更

react源码解析18事件系统

buchila11

React

低代码实现探索(十)流程执行器

零道云-混合式低代码平台

慢跑的正确打开方式

wood

跑步 28天写作

.NET中的Husky工具

喵叔

28天写作 12月日更

一文了解 Redis 内存监控和内存消耗

程序员历小冰

redis 28天写作 12月日更

Go 语言快速入门指南:第七篇 方法

宇宙之一粟

12月日更

Dubbo 框架学习笔记十四

风翱

dubbo 12月日更

黑客是怎么盗取你的密码的?

喀拉峻

黑客 网络安全

Go+ 结构体方法定义教程

liuzhen007

28天写作 12月日更

从0到1带你深入理解log4j2漏洞

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

2021年全国人工智能大赛正式启动,396万奖金等你报名!

OpenI启智社区

人工智能大赛

c语言学习笔记2021/12

姬翔

为什么很难得出结论

将军-技术演讲力教练

启梦行动再扬帆 | 2021启智社区优秀项目&优秀开发者评选结果重磅揭晓

OpenI启智社区

启智社区 优秀开发者 优秀开源项目

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