zoukankan      html  css  js  c++  java
  • 并行运算(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(020, (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

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

  • 相关阅读:
    mysql修改加密方式
    信息安全学习路线
    DNS域传送漏洞
    CSRF漏洞
    反序列化漏洞
    计算机通讯基础
    gorm gen使用
    golang makefile使用
    linux命令行录制
    go代码自动生成注释
  • 原文地址:https://www.cnblogs.com/mikechang/p/1868425.html
Copyright © 2011-2022 走看看