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

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

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/mikechang/p/1868425.html
Copyright © 2011-2022 走看看