PLINQ即将到来(PFX)

来源:百度文库 编辑:神马文学网 时间:2024/04/30 02:08:02

随风 发表于 2007年10月30日
浏览:745 评论:0 源代码附件:0
C#,.NET 3.0/3.5
翻译
Mohammed H. El-Sherief. 著PLINQ is coming up soon (PFX)
简介
自从微软宣布LINQ的时候,我就听说了PLINQ(Parallel Linq),基本思想是DotNet3.5将提供一些新的功能,以更好地利用多核计算机。这个想法非常好,现在也在一个新名词Parallel FX 或 PFX中实现了。
背景
LINQ(Language Integrated Queries) 是C# 3.0, VB9和.net 3.5 中的一个新功能,它提供了一个数据访问的更好的抽象,这样编译器就能更好地优化你的程序(不正对绝对的高手)。
PLINQ可以让你的程序更好地在多核处理器上运行,而不需要使用额外的线程,更不需要进行锁保护等……
PLINQ的编程和LINQ模型一样简单,新的引用库是System.Concurrency.dll,它包括了一个新的接口IParallelEnumerable,当然它也添加了一继承老的IEnumerable的新的集合和数组的方法,这个扩展的方法是AsParrallel,它可以转换任何的集合到允许并行的集合类型IParallelEnumerable
代码使用
看看下面的代码
IEnumerable data = new int[] {1, 2, 3, 4, 5, 6}; // or whatever complex data collectionvar q = data.Where(x => x > 4).OrderBy(x=>x).Select(x => x);foreach (var i in q) ....
这是你在C# 3.0中写的程序,现在,如果你想添加PLINQ功能,你唯一要做的是在使用任何查询前添加AsParallel函数。
这样,代码如下:
IEnumerable data = new int[] {1, 2, 3, 4, 5, 6}; // or whatever complex data collectionvar q = data.AsParallel().Where(x => x > 4).OrderBy(x=>x).Select(x => x);foreach (var i in q) ....
或,用LINQ查询分格编写:
IEnumerable data = new int[] {1, 2, 3, 4, 5, 6}; // or whatever complex data collectionvar q = from i in data.AsParallel()where i > 4orderby iselect i;foreach(var i in q) ....
一旦你添加了AsParallel函数调用,PLINQ就可以在运行的时候把所有的OrderBy, Where, Select, GroupBy等等分配到各个允许的处理器上执行。不过,这并不意味着你可以用PLINQ做任何查询。ParallelEnumerable类还提供了一些其它的方法,如ForAll,它可以用于一个特定集合上的所有成员的一些操作。
IEnumerable data = new int[] {1, 2, 3, 4, 5, 6}; // or whatever complex data collectiondata.ForAll(i=>Console.WriteLine(i));
当然,上面的代码功能是非常简单的,也就是打印一些成员;不过,如果你要做一些复杂的功能,ForAll就会让你的处理速度大大加快。
这些都不是System.Concurrency控件库里的全部,新的并行类提供了一些其它的通用并行语句,因此它和LINQ没有直接的关系,不过最重要的部分是并行,如并行循环语句。
void ParMatrixMult(int size, double[,] m1, double[,] m2, double[,] result){Parallel.For( 0, size, delegate(int i) {for (int j = 0; j < size; j++) {result[i, j] = 0;for (int k = 0; k < size; k++) {result[i, j] += m1[i, k] * m2[k, j];}}});}
这是,我从这里拷贝过来的例子,它展现了如何使用Parallel.For。
这就是我在这一篇文章中所能写的所有内容了,当然,System.Concurrency包含更多的更酷的API。
其它资源
我曾经把这篇文章发布在我的博客上
Optimize Managed Code for Multi-Core MachinesRunning Queries on Multi-Core processorsChannel9 Video Programming in the Age of Concurrency (Andres Hejlsberg and Joe Duffy)