随着计算机硬件的迅猛发展,多核处理器已经在日常生活中普遍应用,但是,现有的大部分计算机程序,对于多核处理器的使用率很低,一般都只利用了单核处理器的性能。在.Net4.0中,集成TPL(Task Parallel Library)和PLINQ(Parallel LINQ),这意味着我们可以应用C# 4.0实现并行化应用,在统一的工作调度程序下进行硬件的并行协调,这将大大提高应用程序的性能同时降低现存并发模型的复杂性,使计算机性能达到合理的应用效果。

那么,我们应用C#武器来开发并发环境下的感受,在System.Threading.Parallel 静态类提供了三个重要的方法For、Foreach、Invoke可以为我们小试牛刀:

这里我们使用如下判断一个数是否为质数的小程序进行测试:

        /// <summary>
        /// 判断一个数是否是质数
        /// </summary>
        /// <paramname="index"></param>
        static bool isZS(long index)
        {
            for (long i = 2; i < (index / 2) + 1; i++)
            {
                if(index % i == 0) return false;
            }
            returntrue;
        }

传统的串行算法如下:

            for(int i = 0; i < Max; i++)
            {
                isZS(i);
            }

并行算法如下:

            Parallel.For(0,Max,
                (i) => { isZS(i); });

在线程争用执行情况下,相同的操作在双核平台下运行,以StopWatch进行精确时间测试,在max值不同的情况下测试结果如下表所示,并行运算的魅力果然名不虚传。

Max 串行算法(毫秒) 并行算法(毫秒)
1000 1 2
10000 76 48
100000 5647 2922

可以看到在计算量大的情况下,并行运行的速度差不多是单线程的两倍,有部分时间消耗在了线程切换调度,但是在计算量小的情况下,由于线程切换耗时,反而造成并行计算耗时更多。在程序管理器中,可以看到对于双核CPU,串行算法只能利用50%左右CPU,而并行算法可以差不多使用100%,因此在程序中合理使用并行计算,可以提高多核计算器的CPU利用率。

posted on 2011-11-22 21:49  展翅飞  阅读(1106)  评论(1编辑  收藏  举报