并行循环

简介: 上次我们讲到了集合。说到集合,那往往少不了循环。今天我们说下什么是并行循环

上次我们讲到了集合。说到集合,那往往少不了循环。今天我们说下什么是并行循环

Parallel.For,Paraller.Foreach

(System.Threading.Tasks)

相信大家对此都不陌生。

long sum = 0;             Parallel.For(0, MaxValue, (i) =>            {                 Interlocked.Add(ref sum, (long)Math.Sqrt(i));                 values.Add(i);             });

也可以Paraller.Foreach.

中断循环:

如果需要中断循环,可以给循环的委托传入一个ParallelLoopState对象,中止循环。有两个方法。

Break,Stop;区别是什么呢?

1:Break---告诉循环不要执行大于当前迭代次数的任何迭代。啥意思呢。就是大于i 的都会停止运行,小于i的依然会执行。注意:可能会有多个循环迭代发起Break调用,要看代码逻辑了。

2:Stop:----停止任何迭代。

问题调整

~对了。在使用并行循环的时候,要确保每次迭代的工作量要明显大于同步共享状态的开销。如果你把循环的时间都耗在阻塞共享的循环变量上,那并行执行也就没意义了。所以每次迭代都进行局部访问,

~并行循环还有另一个问题,就是委托。每次都会生成一个委托,如果每次迭代完成的工作还不如生成委托的开销大。那就是杀鸡用牛刀。大材小用。

说下委托的开销吧。委托的开销分为两种:构造开销和调用开销,调用和普通方法调用差不多。构造开销就很大。你应该只做一次构造,并把对象缓存起来。把委托定义在循环外。

上面的问题怎么解决呢?

用Partitioner类,它会把需要的迭代的区间分拆存入Tuple对象种。

publicstaticvoid Main()   {     Stopwatch watch=new Stopwatch();     constint MaxValue=10000000;     long sum=0;     //普通循环    watch.Restart();     sum=0;     Parallel.For(0,MaxValue,(i)=>{       Interlocked.Add(ref sum,(long)Math.Sqrt(i));     });     watch.Stop();     Console.WriteLine("Parallel.For:{0}",watch.Elapsed);          //分区的For循环    var partitioner=Partitioner.Create(0,MaxValue);     watch.Restart();     sum=0;     Parallel.ForEach(partitioner,(range)=>{       long partialSum=0;       for(int i=range.Item1;i<range.Item2;i++)       {         partialSum+=(long)Math.Sqrt(i);       }       Interlocked.Add(ref sum,partialSum);     });     watch.Stop();     Console.WriteLine("Partitioned Parallel.For:{0}",watch.Elapsed);   }

image.png

 

我的电脑上执行的结果。

上面分区规则是静态的,只要迭代区间划分完毕,每个区间都运行一个委托。其中有一个提前完成,也不会尝试重新分区。

相关文章
|
9月前
并发和并行以及他们的区别
并发:         并发指的是多个任务交替执行的能力,这些任务可能不是同时执行,而是通过快速切换在不同任务之间来实现“同时执行”的效果。在多核处理器上,多个线程可以真正同时执行,而在单核处理器上,线程之间通过时间片轮转实现并发。         所以当谈论并发的时候一定要加个单位时间,也就是说单位时间内并发量是多少?离开了单位时间其实是没有意义的。 并行:         并行指的是多个任务同时执行的能力,每个任务都在独立的CPU上执行。并行通常用于同时处理独立任务,这些任务可以同时执行,而不需要相互等待或协同工作。 两者区别:         关键区别在于并发强调任务在时间上交替执行
47 0
|
1月前
|
分布式计算 并行计算 调度
并行和并发的区别
并行和并发的区别
|
2月前
|
存储 分布式计算 算法
MapReduce计数器,Tash的运行机制,shuffle过程,压缩算法
MapReduce计数器,Tash的运行机制,shuffle过程,压缩算法
34 0
|
9月前
|
存储 算法 数据处理
for 循环嵌套 for 循环,你需要懂的代码性能优化技巧!
本篇分析的技巧点其实是比较常见的,但是最近的几次的代码评审还是发现有不少兄弟没注意到。 所以还是想拿出来说下。
198 4
|
8月前
|
缓存 索引
这 11 个 for 循环优化你得会
这 11 个 for 循环优化你得会
|
11月前
|
Web App开发 测试技术
优化循环的方法-循环展开
优化循环的方法-循环展开
68 0
|
算法 C#
C#多线程(9):多阶段并行线程
C#多线程(9):多阶段并行线程
218 0
C#多线程(9):多阶段并行线程
表达式树练习实践:C#循环与循环控制
表达式树练习实践:C#循环与循环控制
124 0
|
并行计算 Java 数据挖掘
对于并行和并行概念上的理解与总结
并行和并行概念上的理解与总结
1113 0