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

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

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

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

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

  再次运行

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

时间: 2024-10-23 21:54:26

一起谈.NET技术,VS2010&amp;.Net 4.0 之并行运算(Parallel)(For、Foreach)的相关文章

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

VS2010&.Net 4.0的Beta2相比Beta1在性能上有了很大的改进,已经基本可以使用了..NET 4.0给我们带来许多新特性,如动态类型.云平台.并行运算等.本文讨论一下.NET 4.0的并行运算. 其实并行运算并不是在.Net 4.0才有的.大家都知道,通过增加CPU的主频可以提高CPU的性能,但由于设计的限制,主频是不可能无限制的提高.这个时候,把提高性能的方式转向使用多个心(多核),现在的电脑几乎都是多核的.但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很

一起谈.NET技术,ASP.NET 4.0 来了

伴随着VS2010的公开测试,ASP.NET4.0也进入了我们的视线.ASP.NET4.0究竟给我们带来了什么,将在哪些方面提高我们的生产力? 在何时你需要使用ASP.NET4.0开发你的网站程序? 需要更严格的遵守Web标准: 需要更流畅的Web Form开发方式: 需要更好的搜索引擎优化: 需要后知后觉的纠正一些不够优良的设计,这些设计甚至可能是在ASP.NET 1.0发布之前就存在的: 需要将现有的功能重新改造为支持server farm或跨application domains: 需要将

一起谈.NET技术,利用.NET Framework4.0的源代码调试你的应用程序

相关文章:利用ASP.NET MVC源代码调试你的应用程序 .NET Framework 的部分源代码是开源的.这些源代码可以供我们学习和参考.也可在也平时调试应用,直接跳入这些开源了的.NET Framework的代码中.这样既可以学习MS放出来的代码,又可以帮助自己调试.下面我用一个WPF的简单的例子演示一下. 新建一个WPF应用程序,拖一个button,后台代码弹出一个messagebox就行了. private void button1_Click(object sender, Rout

一起谈.NET技术,也玩MVC3.0 Razor自定义视图引擎来修改默认的Views目录结构

刚刚爱上MVC3.0,几个不眠夜的学习越来越有趣.今天随手尝试自定义Mvc3.0的视图引擎,虽然已成功,但是还发现有点小疑问.随手贴出来希望大家指教指教. MVC的视图文件目录被固定/Views目录内,区域视图文件也是被固定在/Areas目录下,出于好奇和对目录名的敏感,尝试修改它.通过reflector找到视图引擎的构造接口类VirtualPathProviderViewEngine 在MVC2.0中,自定义自己的视图引擎,继承它即可,但在3.0中,我发现继承它会缺少一个函数.再reflect

一起谈.NET技术,ASP.NET MVC2.0在Tab页中实现异步无刷新分页

概述 很多地方都存在以Tab页来呈现数据的方式,比如网易.新浪.搜狐.QQ等知名的门户网站的首页,还有大家熟知的博客园首页,都是用了tab页来显示数据.大家之所以喜欢用Tab,因为它能大大的增加显示数据的空间,能在固定的空间中显示更多的数据.分页也是为了方便数据的显示,在应用系统中必不可少.这篇文章使用Jquery在ASP.NET MVC中使用Tab页,以及在Tab页中实现异步无刷新的分页功能.估计这个大家都会用得到的. 在ASP.NET MVC中实现分页,在之前的一篇博文:ASP.NET MV

一起谈.NET技术,分享在MVC3.0中使用jQuery DataTable 插件

前不久在网络上看见一个很不错的jQuery的DataTable表格插件.后来发现在MVC中使用该插件的文章并不多.本文将介绍在MVC3.0如何使用该插件.在介绍该插件之前先简单介绍一下,推荐该插件的原因.在项目中我使用jqgrid比较多.但是发现当进行样式调整时jqgrid的样式常常会让美工头疼.而datatable插件却是一个轻量级的jQuery插件.当我通过浏览器查看该js插件rander后的源码.发现只是一个简单的html table,非常简洁.那么在没有特殊要求的情况下使用这个插件,开发

一起谈.NET技术,ASP.NET 4.0 一些隐性的扩展

ASP.NET 4.0在很多方面都做了改进,在这篇ASP.NET 4.0白皮书就描述了很多ASP.NET 4.0的机制改变和改进.在我的博客中,也有几篇关于ASP.NET4.0的特性修改的文章.但是作为一个全新的框架和运行时,内部肯定还会有很多API和扩展点不会暴露的那么明显.比如今天从这篇文章Three Hidden Extensibility Gems in ASP.NET 4的介绍中,我又了解了一些在我平常开发中绝对非常有用的扩展点. PreApplicationStartMethodAt

一起谈.NET技术,谈谈C# 4.0新特性“缺省参数”的实现

C#4.0关于缺省参数的新特性,相信大家都不会陌生.所谓缺省参数,顾名思义,就是在声明方法的某个参数的时候为之指定一个默认值,在调用该方法的时候如果采用该默认值,你就无须指定该参数.和很多语言层面特性(语法糖)的实现一样,缺省参数也是编译器为我们玩的一个小花招.缺省参数最终体现为两个特殊的自定义特性OptionalAttribute和DefaultParameterValueAttribute . 目录 一.缺省参数的用法 二.实现缺省参数的两个特性:OptionalAttribute和Defa

《创业家》牛文文:少谈点模式多谈点技术

"模式"如同当年的"主义",流行于各种创业大赛.创业励志节目.论坛的"街头"式秀场 文/创业家 牛文文 "美国某某公司你知道吧?就是刚被戴尔.惠普.思科十几亿美元抢购的那家.我们的模式和它的一样,现在还没赢利,可将来起码有十几亿人民币的市值." "我开了小煤矿,但煤运不出去,上商学院之后受到启发,想搞模式创新,具体讲就是想在铁路边上搞个煤炭物流开发区,建一个大的物流和信息流平台,把分散的煤炭集中在我这个园区,这样和铁