PLINQ和LINQ的语法基本是差不多的,PLINQ该如何实现并行

var query = from item in source.AsParallel()
where Compute(item) >
select item;

一个简单的AsParallel方法就能实现并行运行,要声明的是AsParallel方法返回的是ParallelEnumerable而不是Enumerable,如GO语言的go关键字一般简单,虽然我怎么学过go语言,但我知道GO关键字绝对不会这么简单,同样PLINQ并行一样不是这么简单,虽然两个不是一个级别的吧。必须要说明的是不要盲目的使用PLNQ,PLINQ会对输入元素进行分区,增加了复杂性,会有一定性能的消耗,通俗的讲就是你select的语句消耗的时间很短,要小于多线程之间频繁切换的时间。

PLINQ 四种分区方式

  1、范围分区:对输入的元素根据处理器核数对元素进行平分,元素为实现了IList<T>接口的类型。

  2、区块分区:每个线程使用一块区域内的一定数量的元素,区块大小不固定,执行过程中,会动态的进行调整,原则是尽可能保证所有任务同时完成。

  3、条带分区:跳过n个元素,处理m个元素,处理完成后跳过n个元素,执行m个元素

  4、散列分区:。。。。。。没理解,只知道同3一样是对特定的查询进行优化。

并行执行的算法:管道,停止并运行,反向枚举三种算法。

  管道:创建处理器核数+1个线程,一个枚举线程记录状态,其他执行操作

  停止并运行:ToList,ToArray等需要完整结果的的操作时使用该方法,但将占用更多的内存

  反向枚举:使用AsParallel方法后,调用ForAll方法

PLINQ的并行不是绝对的,下面的列表介绍了 PLINQ 默认情况下将按顺序模式执行的查询形状:

  • 包含 Select 子句、已建立索引的 Where 子句、已建立索引的 SelectMany 子句或 ElementAt 子句的查询(在排序或筛选运算符移除或重新排列了索引后)。

  • 包含 Take、TakeWhile、Skip、SkipWhile 运算符并且源序列中的索引未采用原始顺序的查询。

  • 包含zip或SequenceEquals的查询,除非,其中一个数据源具有原始顺序排列的索引和其他数据源可建立索引(IE.. 数组或ilist(t))。

  • 包含 Concat 的查询,除非将其应用到可建立索引的数据源。

  • 包含 Reverse 的查询,除非应用到可建立索引的数据源。

提到过AsParallel方法返回的是ParallelEnumerable,下面列出ParallelEnumerable中几个方法,是我们更加灵活的使用PLINQ(PD:虽然公司里应该不会用到~)。

AsOrdered和AsUnordered方法,告诉PLINQ结果序列中顺序是否(看的比钱)重要。

AsSequential:强制顺序执行。

AsExecutionMode:强制并行执行。

WithDegreeOfParallelism:指定并行时最大的线程数。

WithMergeOptions:设置PLNQ执行时的缓存类型,建议使用默认模式AutoBuffered。

没有贴多少代码,估计自己以后看都懒的看了,因为我没有从头到尾的敲下来,在图书馆几点知识点回来结合网络就这么整理一下,那么怎么才能用到PLINQ(在代码中查找类似循环能被并行执行的代码,尝试转为并行)。

PLINQ 简介的更多相关文章

  1. PLinq

    PLinq(Linq的并行计算) 上面介绍完了For和ForEach的并行计算盛宴,微软也没忘记在Linq中加入并行计算.下面介绍Linq中的并行计算. 4.0中在System.Linq命名空间下加入 ...

  2. C#的变迁史 - C# 4.0 之并行处理篇

    前面看完了Task对象,这里再看一下另一个息息相关的对象Parallel. Parallel对象 Parallel对象封装了能够利用多核并行执行的多线程操作,其内部使用Task来分装多线程的任务并试图 ...

  3. 【转】【C#】【Thread】【Parallel】并行计算

    并行计算 沿用微软的写法,System.Threading.Tasks.Parallel类,提供对并行循环和区域的支持. 我们会用到的方法有For,ForEach,Invoke. Program.Da ...

  4. C# 4.0 并行计算部分

    C# 4.0 并行计算部分   c#linq算法多线程list微软   目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...

  5. c#多线程总结(纯干货)

    线程基础 创建线程 static void Main(string[] args) { Thread t = new Thread(PrintNumbers); t.Start();//线程开始执行 ...

  6. [译]何时使用 Parallel.ForEach,何时使用 PLINQ

    原作者: Pamela Vagata, Parallel Computing Platform Group, Microsoft Corporation 原文pdf:http://download.c ...

  7. C#多线程编程系列(一)- 简介

    目录 系列大纲 一.前言 二.目录结构 四.章节结构 五.相关链接 系列大纲 目前只整理到第二章,线程同步,笔者后面会慢慢更新,争取能把这本书中精华的知识都分享出来. C#多线程编程系列(一)- 简介 ...

  8. C# .NET .NET Framework .NET CORE 等的关系简介

    2019新的一年,祝大家新年快乐,工作生活一帆风顺,心想事成!诸事大吉! 这篇文章是我今年的第一篇博客,主题是:C#  .NET  .NET Framework   .NET CORE  等这些名词之 ...

  9. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

随机推荐

  1. 退出程序是跳过屏幕自检 比如 必输 EXIT-COMMAND

    控制必须输入可以,但是我退出程序的时候还要求我输入个值才能退出,这太变态了,相信很多同志都在SAP程序中反感过这个问题. 标准程序咱就不说了,忍了,新开发的功能还是要解决这个问题. 办法很简单:MOD ...

  2. datagridview控件--导出Excel

    dataGridView控件可以说很方便的显示了数据,而且对于修改和删除数据也很方便,我在前面的一篇博客中写到了如何去绑定数据到该控件上dataGridView控件--绑定数据方法,今天我将如何将数据 ...

  3. cocos2d 中加入显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)

    在 cocos2d 中有三个类能够在层或精灵中加入文字: CCLabelTTF CCLabelBMFont CCLabelAtlas      CCLabelTTF CCLabelTTF 每次调用 s ...

  4. Effective C++ 第二版 17)operator=检查自己 18)接口完整 19)成员和友元函数

    条款17 在operator=中检查给自己赋值的情况 1 2 3 class  X { ... }; X a; a = a;  // a 赋值给自己 >赋值给自己make no sense, 但 ...

  5. zend studio快捷模板 开发工具之zend studio一些配置

    以下是以Zend Studio 10.0.0版本为基础的: 模板的配置(template): [菜单]->[Window]->[preferences]->[PHP]->[Ed ...

  6. 加密解密知识 php非对称加密

    function test1(){ $config = array( "digest_alg" => "sha1", "private_key_ ...

  7. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...

  8. javaScript面向对象基础

    最近学习了js的面向对象,为了能让自己更好的理解,这一篇博客就当作是加深自己学习印象的总结(可能会有很多不足,欢迎指正). js通过函数来创建对象,而且js本身也是一种对象,那么什么又是对象呢,对象包 ...

  9. word-wrap,word-break,text-wrap的区别

    今晚看到了无双老师关于word-wrap,word-break区别的讲解  http://www.cnblogs.com/2050/archive/2012/08/10/2632256.html 受益 ...

  10. 解决闪光灯代码在Nexus5上面打不开的问题

    参考:http://blog.csdn.net/cy524563/article/details/41545387 关键在于: int textureId = 0;whyCamera.setPrevi ...