PLINQ 简介
来源:互联网 发布:漕宝路梦海桑拿js照片 编辑:程序博客网 时间:2024/06/04 18:11
近几年 Microsoft 推出的并行计算编程模型,PLINQ 要占到中心位置。LINQ 是语言集成查询(Language-Integrated Query )的缩写,.NET 框架 3.5 的新特性,它试图在对象领域和数据领域之间架起了一座桥。传统上,数据是SQL的天下,而面向对象语言(如Java,C#等)在编程语言领域称雄,二者之间的沟通很费周章,在编程语言里拼接SQL字串不仅繁琐,而且还容易产生安全漏洞。这时,LINQ出现了,它说:“查询要是语言的一部分!”
PLINQ 是 LINQ 的并行扩展,是 .NET 框架 4.0 的一部分,它的台词是:“程序员写LINQ查询,之后的并行化有我!”
它的重要性来自一下几点:
1. 自2005年以来,摩尔定律失效,单个CPU性能提升有限,多核成为趋势,提高并行程序设计的效率成为对平台提供者来说很紧急的问题。
2. 两种高级并行性:数据并行与任务并行的竞争决出了结果。多年任务并行(多线程及其它)的实践证明了并发复杂性无法有效控制。而数据并行随着Google的MapReduce算法的倍受推崇而得到公认:“Many-Core 时代并行与分布式计算的解决之道”。
3. PLINQ是挖掘数据并行性的解决方案,这种设计是因为数据并行性的众望所归。
下面这个图简要讲解了 PLINQ 的原理:并行任务数和分配方式由数据分割决定的,也就是数据的特性决定并行计算的方式:
数据源最好IList,这样数据分割效率更高。
下面是“判断100000000后100000个自然数是否为素数”的例子:
static int[] arr = Enumerable.Range(100000000, 100000).ToArray(); static void Main(string[] args) { Utils.Measure("Sequential", () => { bool[] results = new bool[arr.Length]; for (int i = 0; i < arr.Length; i++) { results[i] = Utils.IsPrime(arr[i]); } }); Utils.Measure("LINQ", () => { bool[] results = arr. Select(x => Utils.IsPrime(x)). ToArray(); }); Utils.Measure("PLINQ", () => { bool[] results = arr.AsParallel().AsOrdered(). Select(x => Utils.IsPrime(x)). ToArray(); }); }
上述代码用到了两个辅助方法(判断素数和计时):
class Utils { public static void Measure(string name, Action func) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); func(); stopwatch.Stop(); Console.WriteLine("-------------------------"); Console.WriteLine(" " + name); Console.WriteLine(" Time: " + stopwatch.ElapsedMilliseconds + " ms"); Console.WriteLine("-------------------------"); } public static bool IsPrime(long x) { if (x <= 2) return x == 2; if (x % 2 == 0) return false; long sqrtx = (long)Math.Ceiling(Math.Sqrt(x)); for (long i = 3; i <= sqrtx; i++) { if (x % i == 0) return false; } return true; } }
在双核机器上执行的结果:
见LINQ 与简单的顺许方法性能相当,而PLINQ大致得到线性加速比!
细心的朋友可能已经注意到了,上述例子中数据源是在内存里的。如果要支持更多类型数据源,比如SQL Server,则需要相应的 LINQ Provider,比如:
http://www.sheltonblog.com/archive/2008/07/11/list-of-linq-providers.aspx
注:本文转自 : http://www.cnblogs.com/foamliu/archive/2009/12/31/1636919.html
- PLINQ 简介
- PLINQ
- Plinq
- PLinq
- PLINQ -> Parallel Extensions
- 建议84:使用PLINQ
- 并行编程(3):PLinq
- 传统编程和.net plinq
- .Net 3.5中使用PLinq
- TPL Part5 -- 循环和PLINQ
- 并行编程与PLINQ-数据并行
- 并行编程与PLINQ-任务并行
- 何时使用 Parallel.ForEach,何时使用 PLINQ
- C# 并行编程 之 PLINQ 基本使用
- C# PLinq:声明式数据并行
- 【C#】60. PLINQ 的几个选项
- 何时使用 Parallel.ForEach,何时使用 PLINQ
- 并行开发3——plinq的使用
- C#的GC,也就是垃圾回收机制 及其他
- Spring Test 整合 JUnit 4 使用总结
- iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController
- 默认桌面配置相对简便的方法!
- 技术(4)—智能指针
- PLINQ 简介
- 读 Beginning Android Games 2nd Edition (十) 创建绘图类
- 第十次周总结--在路上
- matlab字符串处理
- iOS学习之UINavigationController详解与使用(三)ToolBar
- 将Linq转换为SQL的便捷方法
- 记录几个比较nb的技术性网站
- PowerDesigner代码关联名称映射设置
- Unity3D AnimationView动画视图、动画事件