写点什么

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

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

关注

评论

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

架构师必备的那些分布式事务解决方案!!

架构师修行之路

分布式 微服务 架构设计

Go语言内存管理三部曲(三)图解GC算法和垃圾回收原理

网管

内存管理 垃圾回收 GC GC算法 Go 语言

架构必修:领域边界划分方法--职责驱动设计(RDD)

马迪奥

架构 领域 架构师 RDD

数据结构与算法系列之链表操作全集(一)(GO)

书旅

数据结构 数据结构和算法 Go 语言

1分钟带你入门 React 公共逻辑抽离HOC...

大前端 React Hooks HOC Render Props

Nginx 在运维领域中的应用,看这一篇就够了

华章IT

nginx Linux 运维工程师

Flink窗口算子-6-8

小知识点

scala 大数据 flink

深入java week1-01 字节码、内存、GC、调试工具

闷骚程序员

【线上排查实战】AOP切面执行顺序你真的了解吗

Zhendong

spring aop

年纪轻轻怎么就卵巢早衰了?试管可帮忙!

Geek_65d32f

试管 三代试管

typora增强-mac

老菜鸟

Typora

解析 CloudQuery 审计分析功能

BinTools图尔兹

数据库 sql 安全 工具软件

游戏数值策划之常用excel函数

吴优秀同学

Excel 游戏

架构训练营学习笔记之五技术选型(一)

于成龙

架构训练营

聊聊技术人员如何学习成长

架构精进之路

职业成长

万物互联的IoT时代,柔性电子会大行其道吗?

脑极体

二十、深入Python迭代器和生成器

刘润森

Python

甲方日常 35

句子

工作 随笔杂谈 日常

vivo 商城前端架构升级—前后端分离篇

vivo互联网技术

Java 大前端 前后端分离

算法分析关键

Geek_0b8195

算法和数据结构

分布式下,我想要一致性

架构师修行之路

分布式 微服务

mongodb 源码实现、调优、最佳实践系列-百万级代码量mongodb内核源码阅读经验分享

gmoy-tencent

MySQL mongodb 源码 中间件 分布式数据库mongodb

一个草根的日常杂碎(10月18日)

刘新吾

随笔杂谈 生活记录 社会百态

一个草根的日常杂碎(10月19日)

刘新吾

随笔杂谈 生活记录 社会百态

第四周作业

dll

一个草根的日常杂碎(10月20日)

刘新吾

随笔杂谈 生活记录 社会百态

利用区块链等技术,加强对交通运输信用信息的归集共享和分析应用

CECBC

区块链 交通运输

央行数字货币离我们还有多远?

CECBC

数字货币

Linux的上手命令

Linux 常用命令

java week1练习

闷骚程序员

架构师训练营 1 期 -- 第五周作业

曾彪彪

极客大学架构师训练营

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