随着计算机硬件的迅猛发展,多核处理器已经在日常生活中普遍应用,但是,现有的大部分计算机程序,对于多核处理器的使用率很低,一般都只利用了单核处理器的性能。在.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利用率。