文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>并行运算(Parallel)(For、Foreach)_VS2010&.Net 4.0

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

时间:2010-11-03  来源:MikeChang.NET

其实并行运算并不是在.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方法

代码      /// <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方法

 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.运算结果:

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

 

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

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

再次运行

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

相关阅读 更多 +
排行榜 更多 +
西安交大通

西安交大通

生活实用 下载
长江云通

长江云通

生活实用 下载
translatez

translatez

生活实用 下载