浅谈Visual Studio 2010并行运算原理

在这里我们将介绍Visual Studio 2010并行运算的原理,希望通过本文能对大家了解Visual Studio 2010并行运算。这也是大家比价关心的热点。

Visual Studio 2010 Beta2&.Net 4.0的Beta2相比Beta1在性能上有了很大的改进,已经基本可以使用了。.NET 4.0给我们带来许多新特性,如动态类型、云平台、并行运算等。本文讨论一下.NET 4.0的并行运算。

其实并行运算并不是在.Net 4.0才有的。大家都知道,通过增加CPU的主频可以提高CPU的性能,但由于设计的限制,主频是不可能无限制的提高。这个时候,把提高性能的方式转向使用多个心(多核),现在的电脑几乎都是多核的。但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势。

微软的并行运算平台(Microsoft’s Parallel Computing Platform (PCP))提供了这样一个工具,让软件开发人员可以有效的使用多核提供的性能。本文就进行一个简单的测试,来体验Visual Studio 2010并行运算的性能。

1. 新建一个List,并在开始时初始化


  1. public static IList<int> Datas = new List<int>();  
  2.  
  3.        static void Main(string[] args)  
  4.        {  
  5.            InitializeData();  
  6.  
  7.              
  8.            Console.Read();  
  9.        }  
  10.  
  11.        /// <summary>  
  12.        /// 初始化数据  
  13.        /// </summary>  
  14.        private static void InitializeData()  
  15.        {  
  16.            Datas.Clear();  
  17.            for (int i = 0; i < 20; i++)  
  18.            {  
  19.                Datas.Add(i);  
  20.            }  
  21.        } 

2.设计耗时的方法,并来在各种运算方式中调用



  1.  /// <summary>  
  2. /// 获得数据  
  3. /// </summary>  
  4. /// <param name="i"></param>  
  5. /// <returns></returns>  
  6. private static int GetData(int i)  
  7. {  
  8.     System.Threading.Thread.Sleep(100);  
  9.     return i;  

3. 设计一般的运算方式,调用GetData方法   



  1. /// <summary>  
  2.      /// 采用一般for循环  
  3.      /// </summary>  
  4.      private static void UseFor()  
  5.      {  
  6.          for (int i = 0; i < 20; i++)  
  7.          {  
  8.              GetData(Datas[i]);  
  9.          }  
  10.      }  
  11.  
  12.      /// <summary>  
  13.      /// 采用一般的foreach  
  14.      /// </summary>  
  15.      private static void UseForeach()  
  16.      {  
  17.          foreach (var item in Datas)  
  18.          {  
  19.              GetData(item);  
  20.          }  
  21.      } 

4.采用并行运算的方式,调用GetData方法


  1. /// <summary>  
  2.       /// 采用并行for循环  
  3.       /// </summary>  
  4.       private static void UseParalleFor()  
  5.       {  
  6.           Parallel.For(0, 20, (i) =>  
  7.           {  
  8.               GetData(Datas[i]);  
  9.           });  
  10.  
  11.       }  
  12.  
  13.       /// <summary>  
  14.       /// 采用并行的foreach  
  15.       /// </summary>  
  16.       private static void UserParalleForeach()  
  17.       {  
  18.           Parallel.ForEach(Datas, (t) => { GetData(t); });  
  19.       } 

5.最后采用老赵设计的CodeTimer来比较每一种运算方式的耗时,在Main函数中加入测试代码


  1. static void Main(string[] args)  
  2.        {  
  3.            InitializeData();  
  4.  
  5.            CodeTimer.Initialize();  
  6.            CodeTimer.WriteDebug("一般for循环:", 5, () => { UseFor(); });  
  7.            CodeTimer.WriteDebug("一般foreach循环:", 5, () => { UseForeach(); });  
  8.            CodeTimer.WriteDebug("并行for循环:", 5, () => { UseParalleFor(); });  
  9.            CodeTimer.WriteDebug("并行foreach循环:", 5, () => { UserParalleForeach(); });  
  10.  
  11.            Console.Read();  
  12.        } 

6.运算结果:

浅谈Visual Studio 2010并行运算原理

 

可以看出,并行运算提高的性能还是比较明显的。

下面我们把GetData方法修改一下,把线程延迟的的代码去掉



  1. /// <summary>  
  2. /// 获得数据  
  3. /// </summary>  
  4. /// <param name="i"></param>  
  5. /// <returns></returns>  
  6. private static int GetData(int i)  
  7. {  
  8.    // System.Threading.Thread.Sleep(100);  
  9.     return i;  

再次运行

浅谈Visual Studio 2010并行运算原理

 

可以看出,这时候并行运算不但没降低消耗的时间,反而用了更多的时间。经过多次测试发现,采用并行运算跟程序的设计结构有很大的关系,如果设计不合理,反而会消耗更多时间。










本文转自 yuanzhitang 51CTO博客,原文链接:http://blog.51cto.com/yuanzhitang/500235,如需转载请自行联系原作者