并行运算(Parallel)(For、Foreach)_VS2010&.Net 4.0

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,并在开始时初始化

 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         }
22 


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;
10        }
11 

 

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         }
22 


 

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         }
20 


 

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         }
13 


6.运算结果:

截图00

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

 

下面我们把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;
10         }


再次运行

截图01

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

转载于:https://www.cnblogs.com/mikechang/archive/2010/11/03/1868425.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值