【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

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

关注

评论

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

音视频开发学习:HLS 协议详解

赖猫

c++ 音视频 ffmpeg HLS 音视频开发

【网络安全】详细记录一道简单面试题的思路和方法

H

网络安全

PDF 文件如何转成 markdown 格式

Jerry Wang

markdown PDF pdf.js 1月日更 1月月更

JavaScript 基本数据类型转换

编程三昧

JavaScript 前端 1月月更

Linux之cal命令

入门小站

22 Prometheus之Docker监控简述

穿过生命散发芬芳

Prometheus 1月月更

测试工程师的职场发展二三谈

老张

自动化测试 解决方案 职场发展

微信业务架构图 & 学生管理系统架构设计

阿卷

架构实战营

C/C++开发方向如何选择?坚持C++还有意义吗?

赖猫

c++ Linux 服务器

明道云帮助外贸行业实现数字化管理

明道云

ReactNative进阶(二十八):ES6 Symbol 用法

No Silver Bullet

React Native symbol 1月月更

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」系统服务底层原理以及高性能存储设计分析

洛神灬殇

RocketMQ 阿里巴巴‘ Alibaba技术 Apache RocketMQ 1月日更

🏆【Alibaba中间件技术系列】「Nacos技术专题」服务注册与发现相关的原理分析

洛神灬殇

微服务 nacos 注册中心 Alibaba技术 1月日更

使用 React 和 Next.js 构建博客

devpoint

React nextjs 1月月更

在线XML转CSV工具

入门小站

工具

《腾讯云原生在线技术工坊》实践体会

穿过生命散发芬芳

腾讯云 云原生 1月月更 实践体会

kali权限提升之本地提权

喀拉峻

网络安全 信息安全 提权

第七周作业

lv

低代码实现探索(二十九)混合式低代码

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

构建多架构镜像的最佳实践

xcbeyond

Docker arm docker image xcbeyond 1月月更

(1-18/18)推播式营销vs.集客式营销

mtfelix

300天创作 2022Y300P

在springboot中,如何读取配置文件中的属性

华为云开发者联盟

springboot value 映射 配置文件 RequiredArgsConstructor

减少技术债务的系统方法

俞凡

技术管理 大厂实践 技术债务 Zalando

零代码平台——业务人员的知识变现工具

明道云

用明道云落地高校业务之优秀网站评选

明道云

大白话讲解JDK源码系列:从头到尾再讲一遍ThreadLocal

慕枫技术笔记

后端 1月月更

(1-19/19)市场和销售分别该怎么干

mtfelix

300天创作 2022Y300P

用Java实现线段树

CRMEB

冬奥探秘:那些隐匿在冬奥中的“绿科技”

脑极体

Go len() 函数是如何计算长度的?

宇宙之一粟

Go Go 语言 1月月更

ShardingSphere JDBC 分库实现多数据库源

Java 数据库 分库分表 Apache ShardingSphere

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