注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

转:C#并行运算 Parallel.Invoke、Parallel.For、Parallel.Foreach性能测试及示例  

2018-03-05 09:14:04|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Numerics;  
  7.   
  8. namespace Sample3  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             //准确获取运行时间  
  15.             System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();  
  16.   
  17.             Console.ForegroundColor = ConsoleColor.Yellow;  
  18.             Console.WriteLine("一般串行开始.....");  
  19.             sw.Start();  
  20.             Calc100();  
  21.             Calc100();  
  22.             Calc100();  
  23.             sw.Stop();  
  24.             Console.WriteLine("总耗时 = " + sw.ElapsedMilliseconds + "(ms)");  
  25.   
  26.   
  27.             Console.ForegroundColor = ConsoleColor.Cyan;  
  28.             Console.WriteLine("并行处理开始.....");  
  29.             sw.Restart();  
  30.             sw.Start();  
  31.             Parallel.Invoke(Calc100, Calc100, Calc100);  
  32.             sw.Stop();  
  33.             Console.WriteLine("总耗时= " + sw.ElapsedMilliseconds + "(ms)");  
  34.             Console.ReadLine();  
  35.         }  
  36.   
  37.         static void Calc100()  
  38.         {  
  39.             int n = 1000000;  
  40.             BigInteger b = new BigInteger(long.MaxValue);  
  41.             System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();  
  42.             sw.Start();  
  43.             for (var k = 1; k <= n; k++)  
  44.             {  
  45.                 BigInteger b2 = k * b;  
  46.             }  
  47.             sw.Stop();  
  48.             Console.WriteLine("calc " + n + " times bigint multiply cost time " + sw.ElapsedMilliseconds + "(ms)");  
  49.         }  
  50.     }  
  51. }  

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Numerics;  
  7.   
  8. namespace Sample3  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             /* 
  15.              * Parallel.For这个方法和For循环的功能相似,执行并行循环 
  16.              * 并行如果访问全局变量,会出现资源争夺,大多数时间消耗在了资源等待上,效率不如For 
  17.              */  
  18.             System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();  
  19.             stopWatch.Start();  
  20.             for (int i = 0; i < 10000; i++)  
  21.             {  
  22.                 for (int j = 0; j < 60000; j++)  
  23.                 {  
  24.                     int sum = 0;  
  25.                     sum += i;  
  26.                 }  
  27.             }  
  28.             stopWatch.Stop();  
  29.             Console.WriteLine("NormalFor run " + stopWatch.ElapsedMilliseconds + " ms.");  
  30.   
  31.             stopWatch.Reset();  
  32.             stopWatch.Start();  
  33.             Parallel.For(0, 10000, item =>  
  34.             {  
  35.                 for (int j = 0; j < 60000; j++)  
  36.                 {  
  37.                     int sum = 0;  
  38.                     sum += item;  
  39.                 }  
  40.             });  
  41.             stopWatch.Stop();  
  42.             Console.WriteLine("ParallelFor run " + stopWatch.ElapsedMilliseconds + " ms.");  
  43.             Console.ReadLine();  
  44.         }  
  45.     }  
  46. }  

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Numerics;  
  7.   
  8. namespace Sample3  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();  
  15.             stopWatch.Start();  
  16.             List<int> list = new List<int>();  
  17.             Parallel.For(0, 10000, (i, state) =>  
  18.             {  
  19.                 for (int j = 0; j < 60000; j++)  
  20.                 {  
  21.                     if (j == 1000)  
  22.                     {  
  23.                         state.Stop(); //Parallel中途退出循环  
  24.                         return;  //不要使用break,会出错  
  25.                     }  
  26.                     else  
  27.                     {  
  28.                         double t = j * 1000 + 200/1.3; //做些计算  
  29.                         list.Add(j);  
  30.                     }  
  31.                 }  
  32.             });  
  33.             stopWatch.Stop();  
  34.             Console.WriteLine("ParallelFor run " + stopWatch.ElapsedMilliseconds + " ms.");  
  35.             Console.WriteLine("list counts " + list.Count);  
  36.             Console.ReadLine();  
  37.         }  
  38.     }  
  39. }  

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Numerics;  
  7. using System.Threading;  
  8. using System.Collections.Concurrent;  
  9.   
  10. namespace Sample3  
  11. {  
  12.     class Program  
  13.     {  
  14.         static void Main(string[] args)  
  15.         {  
  16.             List<int> list = new List<int>();  
  17.             Parallel.For(0, 10000, item =>  
  18.             {  
  19.                 list.Add(item);  
  20.             });  
  21.             //结果不对?这是因为List<T>是非线程安全集合,意思就是说所有的线程都可以修改他的值  
  22.             Console.WriteLine("List's count is {0}", list.Count());  
  23.   
  24.             /*正确做法             
  25.              * 线程安全集合,在System.Collections.Concurrent命名空间中, 
  26.              * 看一下ConcurrentBag<T>泛型集合,其用法和List<T>类似 
  27.              * 例如Dictionary的ConcurrentDictionary 
  28.             */  
  29.             ConcurrentBag<int> list2 = new ConcurrentBag<int>();  
  30.             Parallel.For(0, 10000, item =>  
  31.             {  
  32.                 list2.Add(item);  
  33.             });  
  34.             Console.WriteLine("ConcurrentBag's count is {0}", list2.Count());  
  35.             Console.ReadLine();  
  36.         }  
  37.     }  
  38. }  

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Numerics;  
  7. using System.Threading;  
  8. using System.Collections.Concurrent;  
  9.   
  10. namespace Sample3  
  11. {  
  12.     class Program  
  13.     {  
  14.         static void Main(string[] args)  
  15.         {  
  16.             /* 
  17.              * 第一个想到的同步方法就是使用lock或者Monitor, 
  18.              * 然而在4.0 之后微软给我们提供了另一把利器——spinLock, 
  19.              * 它比重量级别的Monitor具有更小的性能开销,它的用法跟Monitor很相似 
  20.              * Parallel.For用起来方便,但是在实际开发中还是尽量少用,因为它的不可控性太高 
  21.              * 容易出现意想不到的错误 
  22.              */  
  23.             SpinLock slock = new SpinLock(false);  
  24.             long sum1 = 0;  
  25.             long sum2 = 0;  
  26.             Parallel.For(0, 100000, i =>  
  27.             {  
  28.                 sum1 += i;  
  29.             });  
  30.   
  31.             Parallel.For(0, 100000, i =>  
  32.             {  
  33.                 bool lockTaken = false;  
  34.                 try  
  35.                 {  
  36.                     slock.Enter(ref lockTaken);  
  37.                     sum2 += i;  
  38.                 }  
  39.                 finally  
  40.                 {  
  41.                     if (lockTaken)  
  42.                         slock.Exit(false);  
  43.                 }  
  44.             });  
  45.             Console.WriteLine("结果1的值为:{0}", sum1);  
  46.             Console.WriteLine("结果2的值为:{0}", sum2);  
  47.             Console.Read();  
  48.         }  
  49.     }  
  50. }  
from:http://blog.csdn.net/smartsmile2012/article/details/72548981
  评论这张
 
阅读(28)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018