zoukankan      html  css  js  c++  java
  • .Net 4.0 之并行运算(Parallel)(For、Foreach)

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

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

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

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

        public static IList<int> Datas = new List<int>();
     
        static void Main(string[] args) 
        { 
          InitializeData(); 
     
          
          Console.Read(); 
        } 
     
        /// <summary> 
        /// 初始化数据 
        /// </summary> 
        private static void InitializeData() 
        { 
          Datas.Clear(); 
          for (int i = 0; i < 20; i++) 
          { 
            Datas.Add(i); 
          } 
        } 
     

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

       /// <summary> 
       /// 获得数据 
       /// </summary> 
       /// <param name="i"></param> 
       /// <returns></returns> 
       private static int GetData(int i) 
       { 
         System.Threading.Thread.Sleep(100); 
         return i; 
       } 
     

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

        /// <summary> 
        /// 采用一般for循环 
        /// </summary> 
        private static void UseFor() 
        { 
          for (int i = 0; i < 20; i++) 
          { 
            GetData(Datas[i]); 
          } 
        } 
     
        /// <summary> 
        /// 采用一般的foreach 
        /// </summary> 
        private static void UseForeach() 
        { 
          foreach (var item in Datas) 
          { 
            GetData(item); 
          } 
        } 
     

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

        /// <summary> 

        /// 采用并行for循环 
        /// </summary> 
        private static void UseParalleFor() 
        { 
          Parallel.For(0, 20, (i) => 
          { 
            GetData(Datas[i]); 
          }); 
     
        } 
     
        /// <summary> 
        /// 采用并行的foreach 
        /// </summary> 
        private static void UserParalleForeach() 
        { 
          Parallel.ForEach(Datas, (t) => { GetData(t); }); 
        } 
      5.最后采用CodeTimer来比较每一种运算方式的耗时,在Main函数中加入测试代码
        static void Main(string[] args) 
        { 
          InitializeData(); 
     
          CodeTimer.Initialize(); 
          CodeTimer.WriteDebug("一般for循环:", 5, () => { UseFor(); }); 
          CodeTimer.WriteDebug("一般foreach循环:", 5, () => { UseForeach(); }); 
          CodeTimer.WriteDebug("并行for循环:", 5, () => { UseParalleFor(); }); 
          CodeTimer.WriteDebug("并行foreach循环:", 5, () => { UserParalleForeach(); }); 
     
          Console.Read(); 
        }
     

      6.运算结果:

      

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

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

      /// <summary> 
      /// 获得数据 
      /// </summary> 
      /// <param name="i"></param> 
      /// <returns></returns> 
      private static int GetData(int i) 
      { 
        // System.Threading.Thread.Sleep(100); 
        return i; 
      } 

      再次运行

      

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

  • 相关阅读:
    DateTime.Now.ToString("yyyy/MM/dd") 时间格式化中的MM为什么是大写的?
    新入门PGSQL数据库(尝试利用PGPOOL实现分布式),摘录笔记
    MongoDB入门教程之C#驱动操作实例
    使用MongoDB C#官方驱动操作MongoDB
    【OOAD】OOAD概述
    【OOAD】设计模式概述
    【OOAD】面向对象设计原则概述
    【OOAD】OOP的主要特征
    深入浅出设计模式——访问者模式(Visitor Pattern)
    深入浅出设计模式——模板方法模式(Template Method Pattern)
  • 原文地址:https://www.cnblogs.com/yuhanzhong/p/2311832.html
Copyright © 2011-2022 走看看