一起谈.NET技术,VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)
2011-09-02 00:20
736 查看
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,并在开始时初始化
2.设计耗时的方法,并来在各种运算方式中调用
3. 设计一般的运算方式,调用GetData方法
4.采用并行运算的方式,调用GetData方法
5.最后采用老赵设计的CodeTimer来比较每一种运算方式的耗时,在Main函数中加入测试代码
6.运算结果:
可以看出,并行运算提高的性能还是比较明显的。
下面我们把GetData方法修改一下,把线程延迟的的代码去掉
再次运行
可以看出,这时候并行运算不但没降低消耗的时间,反而用了更多的时间。经过多次测试发现,采用并行运算跟程序的设计结构有很大的关系,如果设计不合理,反而会消耗更多时间。
其实并行运算并不是在.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; }
再次运行
可以看出,这时候并行运算不但没降低消耗的时间,反而用了更多的时间。经过多次测试发现,采用并行运算跟程序的设计结构有很大的关系,如果设计不合理,反而会消耗更多时间。
相关文章推荐
- VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)
- [转]VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)
- 并行运算(Parallel)(For、Foreach)_VS2010&.Net 4.0
- .Net 4.0 之并行运算(Parallel)(For、Foreach)
- 一起谈.NET技术,关于C#线程,线程池和并行运算的简单使用和对比
- 一起谈.NET技术,ASP.NET 4.0 来了
- C#并行运算 Parallel.Invoke、Parallel.For、Parallel.Foreach性能测试及示例
- 一起谈.NET技术,.Net 4.0 Parallel 编程(五)Task (中)
- !.NET 4.0并行计算深入解读(FOR,FOREACH,Invoke)
- NET 4.0 - C# 4.0 新特性之并行运算(Parallel)
- 一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《在ASP.NET 4 Web Forms中实现URL导向》篇
- 一起谈.NET技术,ASP.NET MVC & EF 构建智能查询 一、智能查询的需求与设计
- NET 4.0 - C# 4.0 新特性之并行运算(Parallel)
- 一起谈.NET技术,ASP.NET 4.0 一些隐性的扩展
- !.NET 4.0并行计算深入解读(FOR,FOREACH,Invoke)
- 一起谈.NET技术,ASP.NET MVC & EF 构建智能查询 二、模型的设计与ModelBinder
- 精进不休 .NET 4.0 (5) - C# 4.0 新特性之并行运算(Parallel) (收藏)
- 一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《自动启动ASP.NET应用》篇
- 一起谈.NET技术,4.0中的并行计算和多线程详解(二)
- 精进不休 .NET 4.0 (5) - C# 4.0 新特性之并行运算(Parallel)