博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net 4.0 之并行运算(Parallel)(For、Foreach)
阅读量:4573 次
发布时间:2019-06-08

本文共 2852 字,大约阅读时间需要 9 分钟。

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; 
  } 

 

  再次运行

  

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

转载于:https://www.cnblogs.com/yuhanzhong/archive/2012/01/04/2311832.html

你可能感兴趣的文章
Octal Fractions
查看>>
Fragment 的生命周期及使用方法详解
查看>>
依赖注入及AOP简述(二)——工厂和ServiceLocator .
查看>>
《大道至简》第一章读后感
查看>>
.NET高性能框架Chloe.ORM-完美支持MySql
查看>>
Scalaz(24)- 泛函数据结构: Tree-数据游览及维护
查看>>
Scalaz(55)- scalaz-stream: fs2-基础介绍,fs2 stream transformation
查看>>
dede:channelartlist currentstyle栏目高亮显示方法
查看>>
程序员眼睛的保护(爱护眼睛,你我做起)
查看>>
Python之路【第六篇】:socket
查看>>
android的用户定位(一)
查看>>
Java 多生产者消费者问题
查看>>
常用的JS技术1
查看>>
商品搜索
查看>>
upc 9519 New Game
查看>>
oracle 用sql实现密码的加密,解密
查看>>
各种蒟蒻模板【如此简单】
查看>>
搜索1016
查看>>
配置算法(第4版)的Java编译环境
查看>>
PostgreSQL 9.6.0 手册
查看>>