.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; 
  } 

 

  再次运行

  

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

转载于:https://www.cnblogs.com/yuhanzhong/archive/2012/01/04/2311832.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值