• [转]VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)


    本文转自:http://kb.cnblogs.com/page/81304/

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

    截图00

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

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

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

      再次运行

    截图01

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

  • 相关阅读:
    资源链接 标签: 笔记 2016-08-15 13:51 66人阅读 评论(0) 收藏
    js函数 标签: javascript 2016-08-12 16:48 56人阅读 评论(0) 收藏
    js数组 标签: javascript 2016-08-03 14:15 131人阅读 评论(0) 收藏
    typeof操作符和instanceof操作符的区别 标签: JavaScript 2016-08-01 14:21 113人阅读 评论(
    js笔记 标签: javascript 2016-08-01 13:30 75人阅读 评论(0) 收藏
    Linux命令 标签: linux 2016-08-01 10:26 508人阅读 评论(0) 收藏
    linux 用户切换 标签: linux 2016-07-30 13:57 144人阅读 评论(0) 收藏
    高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏
    CSS学习笔记
    C++ Primer Plus(6th Edition) 习题总结(2)
  • 原文地址:https://www.cnblogs.com/freeliver54/p/2915148.html
Copyright © 2020-2023  润新知