本文是.Net 并行计算 的第三篇 欢迎大家拍砖,阅读本文需要有LINQ基础,因为并行LINQ (PLinq) 其实是LINQ To Object 的并行实现

  • 什么是并行LINQ

PLinq 其实就是Linq to Object 的并行实现,PLINQ 会尝试充分利用系统的处理。将数据源分片之后,而后在多个处理上进行处理,这就意味着在大部分情况下运行速度会显著提高,PLINQ 通常只需向数据源添加 AsParallel()查询操作,这个还是很简单的吧 下面的例子为大家展示了这点

           List<int> TestDemo = Enumerable.Range(1, 10000).ToList();
Stopwatch w1 = Stopwatch.StartNew();
var linqParallel = from c in TestDemo.AsParallel() where c % 2 == 0 select c;
int count = linqParallel.ToList().Count;
Console.WriteLine("并行Linq耗时" + w1.ElapsedMilliseconds + "找到偶数:" + count);

大家知道上面的例子是怎么执行的吗?其实在默认的情况下PLinq是保守的。他会先分析总体结构和的并行查询是否安全,如果并行查询性能因为并行而提高而且安全的话就会使用并行查询。否则就会顺序执行,当然你也可以直接指定使用并行查询。

 var linqParallel = from c in TestDemo.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism) where c % 2 == 0 select c;
  • 影响PLINQ查询性能的因素

1.总体工作的计算开销

首先大家都明白并行化会有性能的开销所以PLINQ的查询的必须要有足够的运算来弥补这样的开开销,如果运算量很小则不适合使用PLINQ;大家看看下面的例子,才看看运行结果 是PLINQ 的时间多还是LINQ的时间多,在笔者的电脑中并行LINQ 所需时间要大于非并行LINQ

1
2
3
4
5
6
7
List<int> TestDemo = Enumerable.Range(1, 1000000).ToList();
 Stopwatch w1 = Stopwatch.StartNew();
 var linqParallel = from num in TestDemo.AsParallel() where  num / 3 == 0 select num;
 Console.WriteLine("并行Linq耗时" + w1.ElapsedMilliseconds );
 Stopwatch w2 = Stopwatch.StartNew();
 var linql = from num in TestDemo where num / 3 == 0 select num;
 Console.WriteLine("非并行Linq耗时" + w2.ElapsedMilliseconds );

如果我们做如下修改,那么PLINQ的性能优势立即就显现出来了,因为在SELECT的语句有足够的工作来抵消并行带来的性能开销

 private static int MyTest(int a)
{ Thread.Sleep(1000);
Random r= new Random(1000);
return r.Next();
}
            List<int> TestDemo = Enumerable.Range(1, 100).ToList();
Stopwatch w1 = Stopwatch.StartNew();
var linqParallel = from num in TestDemo.AsParallel() where num / 3 == 0 select MyTest(num);
Console.WriteLine("并行Linq耗时" + w1.ElapsedMilliseconds );
Stopwatch w2 = Stopwatch.StartNew();
var linql = from num in TestDemo where num / 3 == 0 select MyTest(num);
Console.WriteLine("非并行Linq耗时" + w2.ElapsedMilliseconds );
Console.ReadLine();

2.系统的逻辑内核
       这个地方我好想很好理解,一样代码,你在4核心机器上和8核心的机器上,肯定是8核跑的快些原因是可以在更多并行线程之间分担工作加速的总量取决于查询的总体工作中可并行化的百分比。  但是,请不要假定所有查询在八核计算机上的运行速度都比在四核计算机的运行速度快两倍在PLINQ中我们可以指定使用处理器的个数但是最多不能操过64个如下例中

1
var linqParallel = from num in TestDemo.AsParallel().WithDegreeOfParallelism(2) where num / 3 == 0 select MyTest(num);

3.查询的执行方式

这里在后面会讲到,现在就不说了。

4.操作数量和种类

对于必须要保持元素在源序列中的顺序的情况,PLINQ 提供了 AsOrdered 运算符。 排序会产生开销,但此开销通常是适度的。  GroupBy 和 Join 操作同样也会产生开销。  如果允许按任意顺序处理源集合中的元素,并在这些元素就绪时立即将它们传递到下一个运算符

 
 
分类: .Net

并行Linq(一)的更多相关文章

  1. C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

    学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...

  2. C# 多线程八之并行Linq(ParallelEnumerable)

    1.简介 关于并行Linq,Ms官方叫做并行语言集成(PLINQ)查询,其实本质就是Linq的多线程版本,常规的Linq是单线程的,也就是同步的过程处理完所有的查询.如果你的Linq查询足够简单,而且 ...

  3. C#编程(六十三)----------并行LINQ

    并行LINQ .NET4在System.Linq命名空间中包含一个新类ParallelEnumerable,可以分解查询的工作使其分布在多个线程上.尽管Enumerable类给IEnumerable& ...

  4. 并行Linq

    有时候我们对大批量数据进行处理,此时并行linq就起作用了. 并行查询 对于以下查询可以耗时会非常大,如下: ; var r = new Random(); , arraySize).Select(x ...

  5. 四、并行编程 - 并行LINQ(PLINQ) 的使用。AsParallel

    用于对内存中的数据做并行运算,也就是说其只支持 LINQ to Object 的并行运算 一.AsParallel(并行化) 就是在集合后加个AsParallel(). 例如: , ); == ); ...

  6. .NET 实现并行的几种方式(三)

    本随笔续接:.NET 实现并行的几种方式(二) 在前两篇随笔中,先后介绍了 Thread .ThreadPool .IAsyncResult (即 APM系列) .Task .TPL (Task Pa ...

  7. .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)

    阅读目录: 1.开篇介绍 2.NET并行计算基本介绍 3.并行循环使用模式 3.1并行For循环 3.2并行ForEach循环 3.3并行LINQ(PLINQ) 1]开篇介绍 最近这几天在捣鼓并行计算 ...

  8. c# Linq查询

    c#提供的ling查询极大的遍历了集合的查询过程,且使用简单方便,非常的有用. 下面将分别用简单的例子说明:ling基本查询.延迟查询属性.类型筛选.复合from字句.多级排序.分组查询.联合查询.合 ...

  9. 第十讲(LINQ)

    一..LINQ查询 例如: static void LINQQuery() { var query = from r in Formula1.GetChampions() where r.Countr ...

随机推荐

  1. hdu 最大三角形(凸包+旋转卡壳)

    老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大.Eddy对这道题目百思不得其解,想不通用什么方法 ...

  2. 小程序大智慧,sqlserver 注释提取工具

    原文:小程序大智慧,sqlserver 注释提取工具 开篇背景 我习惯在写表的创建脚本时将注释直接写在脚本里,比如 /*账套*/ CREATE TABLE [dbo].[AccountingBook] ...

  3. 为代码减负之&lt;一&gt;触发器(SQL)

    对触发器一词早有耳闻(最早是在耿大妈的数据库视频中),当初看完视频后,对理解不深刻的东西如:触发器,存储过程,事务,日志等等没有具体的去查阅,也没有具体的去尝试,应用.所以才导致了今天的博客(把曾经丢 ...

  4. oracle创建user具体指示

    一个.用户的概念 用户,这是user,通俗的讲就是参观oracle数据库"人".在oracle在.的各种安全参数的用户可控制,为了保持数据库的安全性,的概念包括模型(schema) ...

  5. 异步编程(Async和Await)的使用

    .net4.5新特性之异步编程(Async和Await)的使用 一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个“主题”.即:C#1.0托管代码→C#2. ...

  6. TRILL浅析

    1 TRILL概述 TRILL的全称就是Transparent Interconnection of Lots of Links,顾名思义,其本质就是将非常多条链路透明地组织在一起,以致于上层IP应用 ...

  7. [ 单例、代理 & 通知 ]

    PS:手写单例.代理方法实现 & 通知的简单使用! [ 单例模式,代理设计模式,观察者模式! ] 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设 ...

  8. vS2010 列表控件 加入右键菜单

    1.首先,就需要信息加入权限控制,例如,下面的对话框弹出 2,例如以下图选择须要的消息响应,这里选择NM_RCLICK 消息. 3,加入例如以下代码 </pre><pre name= ...

  9. WebBrowser控件应用:播放PPT文件

    原文:WebBrowser控件应用:播放PPT文件 一开始想的是用webform来做,用iframe加载文件,把ppt文件另存成htm,然后播放. 可是后来发现,的程序不大容易控制,所以改用winfo ...

  10. HDU 1501 Zipper(DP,DFS)

    意甲冠军  是否可以由串来推断a,b字符不改变其相对为了获取字符串的组合c 本题有两种解法  DP或者DFS 考虑DP  令d[i][j]表示是否能有a的前i个字符和b的前j个字符组合得到c的前i+j ...