.NET Framework 4.0中的TPL(Task Parallel Library)支持了并行化计算,可合理地运用在实际项目开发过程中,以提高程序的执行效率。
1、Parallel.For循环
本例分别对普通遍历求和计算NoParallel,无同步Lock的并行化求和计算ParallelNoLock和并行化求和有同步的Lock并行化求和计算ParallelLock执行了5次计算,这三个方法都做相同的事情,就是计算1-20的和并在每次循环后线程休眠50毫秒(模拟真实大运算环境),程序代码及运行结果如下:
class A { //普通遍历求和计算 public void NoParallel(int times) { Stopwatch sw = Stopwatch.StartNew(); int result = 0; for (int i = 0; i < times; i++) { result += i; Thread.Sleep(50); //为模拟大量计算,线程休眠50毫秒,下同 } Console.WriteLine("普通遍历,结果:{0},耗时:{1}毫秒",result,sw.ElapsedMilliseconds); } //使用了并行化求和计算,没有同步Lock public void ParallelNoLock(int times) { Stopwatch sw = Stopwatch.StartNew(); int result = 0; Parallel.For(0, times, i => { result += i; Thread.Sleep(50); }); Console.WriteLine("并行遍历(无Lock),结果:{0},耗时:{1}毫秒", result, sw.ElapsedMilliseconds); } private Object syncHandle = new object(); //使用了并行化求和计算,使用了同步Lock public void ParallelLock(int times) { Stopwatch sw = Stopwatch.StartNew(); int result = 0; Parallel.For(0, times, i => { lock (syncHandle) { result += i; } Thread.Sleep(50); }); Console.WriteLine("并行遍历(有Lock),结果:{0},耗时:{1}毫秒", result, sw.ElapsedMilliseconds); } } //调用 A a = new A(); Console.WriteLine("普通遍历=>"); for (int i = 0; i < 5; i++) { a.NoParallel(20); } Console.WriteLine("并行遍历(无Lock)=>"); for (int i = 0; i < 5; i++) { a.ParallelNoLock(20); } Console.WriteLine("并行遍历(有Lock)=>"); for (int i = 0; i < 5; i++) { a.ParallelLock(20); }