.NET(C#):警惕PLINQ结果的无序性
.NET(C#):警惕PLINQ结果的无序性
PLINQ的运行结果是无序的,也就是不保持原来集合的顺序来操作(当然除了一些专门的排序操作)。原因则是线程的并发执行本来就充满了不确定性,把原来一个任务分割成好几个部分同时进行返回的结果会打乱原来的顺序,如果要强制保留顺序,肯定要浪费一些性能,PLINQ是可以这样的,但默认不这样。
先看一个LINQ示例:
var arr = new int[] { 1, 2, 3, 4, 5 };
var res = arr.Where(i => i != 3);
结果是:
1, 2, 4, 5
顺序是保持的。而PLINQ:
var res = arr.AsParallel().Where(i => i != 3);
结果顺序变了:
1, 4, 5, 2
使用PLINQ的AsOrdered和AsUnordered可以命令PLINQ执行保留原集合顺序或者不保留。
把上面的PLINQ改成:
var res = arr.AsParallel().AsOrdered().Where(i => i != 3);
结果就是:1, 2, 4, 5了。
不过如果对PLINQ集合进行了排序那么后续操作会自动保持顺序,就像调用了AsOrdered。
var res = arr.AsParallel().OrderBy(i => i).Where(i => i != 3);
结果也是:1, 2, 4, 5了。
注意某些PLINQ方法如果没有保持顺序执行意义不大,比如Reverse方法:
var res = arr.AsParallel().Reverse();
结果会是:
5, 3, 2, 1, 4
.NET(C#):警惕PLINQ结果的无序性的更多相关文章
- 从集合的无序性看待关系型数据库中的"序"
本文目录:1.集合的特征2.集合的无序性3.表中记录的无序性4.集合的"序"和物理存储顺序之间的关系5.查询结果(虚拟表)的无序性.随机性6.为什么总是强调"无序&quo ...
- redis:set集合类型的操作(无序集合)
1. set集合类型的操作(无序集合) 集合具有无序性(没有顺序).确定性(描述是确定的).唯一性(没有重复的元素) 1.1. sadd key member [member ...] 语法:sadd ...
- 告知你不为人知的UDP-连接性和负载均衡
版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/812444001486438028 来源:腾云阁 h ...
- Redis之无序集合类型命令
Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ...
- iOS NSSet 学习 “无序数组” & 去重 案例
“NSSet,NSMutableSet,和NSCountedSet类声明编程接口对象的无序集合(散列存储:在内存中的存储位置不连续). 而NSArray,NSDictionary类声明编程接口对象的有 ...
- 分布式场景下Kafka消息顺序性的思考
如果业务中,对于kafka发送消息异步消费的场景,在业务上需要实现在消费时实现顺序消费, 利用kafka在partition内消息有序的特点,消息消费时的有序性. 1.在发送消息时,通过指定parti ...
- C#并行编程-并发集合
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- C#并行编程 z
目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 基于任务的程序 ...
- 学习javascript数据结构(三)——集合
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...
随机推荐
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- cull/clip distance example
http://www.gamedev.net/topic/578866-d3d10-how-to-increase-maxcount-of-sv_clipdistance/ The D3D#_CL ...
- Cesium学习笔记(七):Demo学习(自由控制飞行的飞机)[转]
https://blog.csdn.net/umgsoil/article/details/74923013# 这是官方的教程Demo,名字叫Use HeadingPitchRoll,顾名思义,就是教 ...
- Zindex和png
Z轴在元素设置position为absolute或relative后被激活,起大小由z-index设置,z-index越大,元素位置越靠上.如果多个元素的z-index值相同,那么html标签中后出现 ...
- Eclipse系列:如何设置Eclipse关联JDK源码和文档
一.设置Eclipse关联JDK源码 1.打开Eclipse-->Windows-->Preferences 2. 在弹出的Preferences对话框中,Java--> ...
- C#线程同步方法汇总
我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在 后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线 ...
- 快速教你成为C#高手教程
C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序设计语言. C#看起来与Java有着惊人的相似:它包括了诸如单一继承.接口.与Java几乎同样的语法 和编译成中间代 ...
- C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出
C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出,这里使用到了Windows API SetConsoleCtrlHandler函数 注意:在VS中调试执行时,在处理程序例程中设置断 ...
- IntelliJ IDEA windows与mac下常用快捷键
摘自: http://www.th7.cn/Program/java/201604/817219.shtml 1.找文件找代码找引用 shif双击在项目的所有目录查找 ctrl+f(mac下:comm ...
- 【Spark】Spark Streaming 动态更新filter关注的内容
Spark Streaming 动态更新filter关注的内容 spark streaming new thread on driver_百度搜索 (1 封私信)Spark Streaming 动态更 ...