随着多核处理器的普及,程序的并行执行变得越来越重要。.NET3.5引入了PLINQ(Parallel Language Integrated Query)和Parallel FX(PFX),这些技术为开发者提供了在多核机器上编写高性能程序的新方法。
LINQ(Language Integrated Query)是.NET3.5中引入的新特性,它将查询的概念提升为.NET编程语言中的一等公民。LINQ旨在提供更好的数据操作抽象,使得编译器和运行时能够在性能优化等方面提供帮助。
PLINQ是一种在多核机器上运行代码的方法,而无需显式定义线程、锁等。它利用了LINQ模型,并引入了新的程序集System.Concurrency.dll,其中包含了IParallelEnumerable
以下是使用PLINQ的C#代码示例:
IEnumerable data = new int[] {1, 2, 3, 4, 5, 6};
var q = data.AsParallel().Where(x => x > 4).OrderBy(x => x).Select(x => x);
foreach (var i in q) { ... }
在上面的代码中,通过调用AsParallel()方法,PLINQ将准备好在所有可用的处理器上透明地执行OrderBy、Where、Select、GroupBy等操作。不需要显式创建线程、锁和管理并发执行(除非正在做一些大型项目)。
System.Concurrency库中还引入了Parallel类,它提供了一些通用的并行执行功能,这些功能与LINQ无关。Parallel.For函数是Parallel类中最重要的部分,它执行一个并行循环。
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进行矩阵乘法。Parallel.For方法接受起始索引和长度,然后是一个委托来执行。
PLINQ是PFX的一个子集,PFX是一个更大的概念,它包含了许多通用API,可以帮助解决开发者可能遇到的各种并发问题。