阅读目录:
- 1.开篇介绍
- 2.NET并行计算基本介绍
-
3.并行循环使用模式
- 3.1并行For循环
- 3.2并行ForEach循环
- 3.3并行LINQ(PLINQ)
最近这几天在捣鼓并行计算,发现还是有很多值得分享的意义,因为我们现在很多人对它的理解还是有点不准确,包括我自己也是这么觉得,所以整理一些文章分享给在使用.NET并行计算的朋友和将要使用.NET并行计算的朋友;
NET并行编程推出已经有一段时间了,在一些项目代码里也时不时会看见一些眼熟的并行计算代码,作为热爱技术的我们怎能视而不见呢,于是捣鼓了一番跟自己的理解恰恰相反,看似一段能提高处理速度的并行代码为能起效果,跟直接使用手动创建的后台线程处理差不多,这不太符合我们对.NET并行的强大技术的理解,所以自己搞了点资料看看,实践了一下,发现在使用.NET并行技术的时候需要注意一些细节,这些细节看代码是看不出来的,所以我们看到别人这么用我们就模仿这么用,我们需要自己去验证一下到底能提高多少处理速度和它的优势在哪里;要不然效率上不去反而还低下,查看代码也不能很好的断定哪里出了问题,所以还是需要系统的学习总结才行;
现在的系统已经不在是以前桌面程序了,也不是简单的WEB应用系统,而是大型的互联网社区、电子商务等大型系统,具有高并发,大数据、SOA这些相关特性的复杂体系的综合性开放平台;.NET作为市场占有率这么高的开发技术,有了一个很强大的并行处理技术,目的就是为了能在高并发的情况下提高处理效率,提高了单个并发的处理效率也就提高了总体的系统的吞吐量和并发数量,在单位时间内处理的数据量将提高不是一个系数两个系数;一个处理我们提高了两倍到三倍的时间,那么在并发1000万的顶峰时时不时很客观;
2】.NET并行计算基本介绍
既然是.NET并行计算,那么我们首先要弄清楚什么叫并行计算,与我们以前手动创建多线程的并行计算有何不同,好处在哪里;我们先来了解一下什么是并行计算,其实简单形容就是将一个大的任务分解成多个小任务,然后让这些小任务同时的进行处理,当然纯属自己个人理解,当然不是很全面,但是我们使用者来说足够了;
在以前单个CPU的情况下只能靠提高CPU的时钟频率,但是毕竟是有极限的,所以现在基本上是多核CPU,个人笔记本都已经基本上是4核了,服务器的话都快上20了;在这样一个有利的计算环境下,我们的程序在处理一个大的任务时为了提高处理速度需要手动的将它分解然后创建Thread来处理,在.NET中我们一般都会自己创建Thread来处理单个子任务,这大家都不陌生,但是我们面临的问题就是不能很好的把握创建Thread的个数和一些参数的控制,毕竟.NET并行也是基于以前的Thread来写的,如何在多线程之间控制参数,如何互斥的执行的线程顺序等等问题,导致我们不能很好的使用Thread,所以这个时候.NET并行框架为我们提供了一个很好的并行开发平台,毕竟大环境就是多核时代;
下面我们将接触.NET并行计算中的第一个使用模式,有很多并行计算场景,归结起来是一系列使用模式;
3】并行循环模式
并行循环模式就是将一个大的循环任务分解成多个同时并行执行的小循环,这个模式很实用;我们大部分处理程序的逻辑都是在循环和判断之间,并行循环模式可以适当的改善我们在操作大量循环逻辑的效率;
我们看一个简单的例子,看到底提升了多少CPU利用率和执行时间;
1 using System; 2 using System.Collections.Generic; 3 using System.Threading.Tasks; 4 using System.Diagnostics; 5 6 namespace ConsoleApplication1.Data 7 { 8 public class DataOperation 9 { 10 private static List<Order> orders = new List<Order>(); 11 12 static DataOperation() 13 { 14 for (int i = 0; i < 9000000; i++) 15 { 16 orders.Add(new Order() { Oid = Guid.NewGuid().ToString(), OName = "OrderName_" + i.ToString() }); 17 } 18 } 19 20 public void Operation() 21 { 22 Console.WriteLine("Please write start keys:"); 23 Console.ReadLine(); 24 25 Stopwatch watch = new Stopwatch(); 26 watch.Start(); 27 orders.ForEach(order => 28 { 29 order.IsSubmit = true; 30 int count = 0; 31 for (int i = 0; i < 2000; i++) 32 { 33 count++; 34 } 35 }); 36 watch.Stop(); 37 Console.WriteLine(watch.ElapsedMilliseconds); 38 } 39 40 public void TaskOperation() 41 { 42 Console.WriteLine("Please write start keys:"); 43 Console.ReadLine(); 44 45 Stopwatch watch = new Stopwatch(); 46 watch.Start(); 47 Parallel.ForEach(orders, order => 48 { 49 order.IsSubmit = true; 50 int count = 0; 51 for (int i = 0; i < 2000; i++) 52 { 53 count++; 54 } 55 }); 56 watch.Stop(); 57 Console.WriteLine(watch.ElapsedMilliseconds); 58 } 59 } 60 }