引言
随着CPU多核的普及,编程时充分利用这个特性越显重要。本文首先用传统的嵌套循环进行数组填充,然后用.NET 4.0中的提供的来并行地进行填充(当然这里也用到嵌套循环),通过对比发现其中差异。主要内容如下:
- 通常的数组填充
- 并行的组数填充
- 性能比较
- System.Threading.Tasks分析,这个将在续篇.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(二)中介绍
1、通常的数组填充
首先看如下代码:
- using System;
-
- namespace ParallelForSample
- {
- public class SingleCore
- {
- public static void Calculate(int calcVal)
- {
- Utility util = new Utility();
- util.Start();
-
- int[,] G = new int[calcVal, calcVal];
- for (int k = 0; k < calcVal; k++)
- for (int i = 0; i < calcVal; i++)
- for (int j = 0; j < calcVal; j++)
- G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]);
- util.Stop();
-
- }
- }
- }
上面的粗体红色显示的几行代码就是实现数组填充,这个很好理解不用多费口舌。补充说明的是:上面的Utility是为了统计性能而编写的一个类,它主要就是用到了对象——它提供一组方法和属性,可用于准确地测量运行时间。Utility的代码如下:
- public class Utility
- {
- private Stopwatch _stopwatch;
- public void Start()
- {
- _stopwatch = new Stopwatch();
- _stopwatch.Start();
- }
-
- public void Stop()
- {
- _stopwatch.Stop();
- TimeSpan ts = _stopwatch.Elapsed;
- string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
- ts.Hours, ts.Minutes, ts.Seconds,
- ts.Milliseconds / 10);
- Console.WriteLine("Time taken : {0}", elapsedTime);
- }
- }
利用它我们就可以对数组填充所耗费的时间进行计算了。
2、并行的组数填充
为了充分利用CPU的多核,我们编写如下代码:
- using System;
- using System.Threading.Tasks;
-
- namespace ParallelForSample
- {
- public class MultiCore
- {
- public static void Calculate(int calcVal)
- {
- Utility util = new Utility();
- util.Start();
-
- int[,] G = new int[calcVal, calcVal];
-
- Parallel.For(0, calcVal,
- delegate(int k)
- {
- Parallel.For(0, calcVal, delegate(int i)
- {
- for (int j = 0; j < calcVal; j++)
- G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]);
- });
- }
- );
-
- util.Stop();
- }
- }
- }
留意上面的红色粗体显示的几行代码,它利用了方法,Parallel类位于命名空间中,它支持并行循环。此Parallel.For方法使得它里面的迭代可能并行地运行,注意到上述代码中它的第三个参数是一个委托。在(0,calcVal)之间,这个委托将被调用。
3、性能比较
现在我们来测试一下,上面两种方法的执行性能差异如何,源码。其实,核心代码已经在上面贴出来了,现在注意是编写实例来测试,代码主要如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace ParallelForSample
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("Single core");
- SingleCore.Calculate(1000);
- Console.WriteLine("Multi core");
- MultiCore.Calculate(1000);
- Console.WriteLine("Finished");
- Console.ReadKey();
- }
- }
- }
运行之后得到如下结果:(不同电脑配置不同,得出结果不同)
图1、性能比较
从结果可以看出,并行的数组填充比通常的数组填充性能更高。
- System.Threading.Tasks分析,这个将在续篇.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(二)中介绍……
本文转自Saylor87 51CTO博客,原文链接:http://blog.51cto.com/skynet/365678,如需转载请自行联系原作者