一起谈.NET技术,VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)

简介:   VS2010&.Net 4.0的Beta2相比Beta1在性能上有了很大的改进,已经基本可以使用了。.NET 4.0给我们带来许多新特性,如动态类型、云平台、并行运算等。本文讨论一下.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,并在开始时初始化

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

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

目录
相关文章
|
12月前
|
缓存 前端开发 JavaScript
采用.Net Core技术框架开发的医院云LIS平台源码,B/S架构
基于B/S架构的医学实验室检验系统源码,整个系统的运行基于WEB层面,只需要在对应的工作台安装一个浏览器软件有外网即可访问。全套系统采用云部署模式,部署一套可支持多家医院检验科共同使用。 采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。
|
安全 NoSQL MongoDB
.Net线程同步技术解读
C#开发者(面试者)都会遇到lock(Monitor),Mutex,Semaphore,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别。
.Net线程同步技术解读
|
移动开发 负载均衡 前端开发
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
143 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(7)
|
网络架构
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
160 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(6)
|
SQL 运维 监控
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
177 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(5)
|
SQL 消息中间件 存储
2022届软件技术专业毕业生就业岗位分析(.Net方向)(4)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(4)
152 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(4)
|
SQL 运维 关系型数据库
2022届软件技术专业毕业生就业岗位分析(.Net方向)(3)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(3)
152 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(3)
|
存储 SQL 关系型数据库
2022届软件技术专业毕业生就业岗位分析(.Net方向)(2)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(2)
102 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(2)
|
人工智能 运维 Java
2022届软件技术专业毕业生就业岗位分析(.Net方向)(1)
2022届软件技术专业毕业生就业岗位分析(.Net方向)(1)
366 0
2022届软件技术专业毕业生就业岗位分析(.Net方向)(1)
|
设计模式 C# 数据库
.Net5发布在即,当心技术断层
.Net5发布在即,当心技术断层
181 0
.Net5发布在即,当心技术断层