Parallel并行编程初略(一)
2010-06-29 22:24 月光下的凤尾族 阅读(963) 评论(0) 编辑 收藏 举报高性能的程序实际应用当中的一大追求,上系统的目的,不就是要提高效率么.升级硬件,优化软件,这些都太复杂.
.net framework 4.0提供了并行库,看上去是最直接提高性能的东西了,必竟现在的机器都是多核,白白闲着几个CPU资源不用.费力去优化代码岂不是骑驴找马?先来看看它有什么.
首先找到库, 原来是在System.Threading.Tasks下, 实际上就是增加了个Parallel类,就是这么简单.实际上它只提供了3个方法,就是For, Foreach, Invoke,及重载而已,真是简单,直接.
先试用下最简单的Invoke, 发现是需要个Action的数组.我们来理解下"并行"的概念,比如看车道, 2车道4车道,同时跑车,这就是并行了.各玩各的,互产干涉,理论上性能的提升就是车道数成正比.双核提升1倍,4核就是4倍, 那么如果用上Intel最新出的80核CPU, 理论性能就能提高80倍,并行麻.
看来这个东东提升性能就是这么简单直接.
看看Action是什么东西,public delegate void Action(), 原来就是个无参数无返回值的裸代理.那么只要把我们要并行执行的操作包装成一个无参数无返回值的裸方法,再把这一组方法作参数调用
Parallel.Invoke, 它自然后根据硬件的CPU数自动并行执行了,真是简单啊.
如下:
List<Action> actions = new List<Action>();
actions.Add(new MyTest().Test);
actions.Add(new YouTest().ATest);
Parallel.Invoke(actions.ToArray());
简单实测了数值计算,在我双核机器下,运算速度的确是刚好提升一倍.
从以上代码可以看出,初步使用并行处理,毫无技术含量,简单到和Console.Write("Hello Parallel.")是一样的.连控件都不需要拖.它看上去比较适合处理并行的事情,就是不相干,能同时进行的事.比如多人同时访问某网站, 的确是个为互联网而蛋生的类库.
同时这里面暗含了一个现代编程要处理的概念.就是(不相干)的一堆事.如何解藕任务,并行任务中不要去争用资源比如硬盘,全局数据等, 是未来的一项重要内容.