并行循环

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

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对象种。

public static void Main()
  {
    Stopwatch watch=new Stopwatch();
    const int 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);
  }

我的电脑上执行的结果。

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

原文地址:https://www.cnblogs.com/ccaa/p/12184749.html

时间: 2024-11-02 08:59:37

并行循环的相关文章

.Net并行编程之二:并行循环

本篇内容主要包括: 1.能够转化为并行循环的条件 2.并行For循环的用法:Parallel.For 3.并行ForEach的用法Parallel.ForEach 4.并行LINQ(PLINQ)的用法AsParallel() 5.并行中断与并行停止的用法与区别 6.外部控制循环取消的方法(Break,Stop) 7.处理循环体中抛出的异常 8.小循环体的分区并行方法:Parallel.ForEach 9.最大并行度的控制,Parallel.For,Parallel.ForEach 10.在循环体

[No000088]并行循环vs普通循环

using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace Chinese中文排序Sort { internal class Program { private static List<int> Data = new List<int>(); /// <summary> /// 是否显示执行过程 /// &l

labview多个并行循环同时退出

labview中停止并行的循环 问题: 在labview中我如何停止两个并行的循环?我使用一个局部变量,但是当我停止程序执行后,第二次不能运行程序.我该如何解决这个问题呢? 解答:  你使用局部变量来停止并行的2个while循环的执行是正确的.但是,要记住你的局部变量是一个布尔型实体,你不能使用latch mechanical action(锁存器机械动作).当该值从真变为假,然后再变回真的时候,变化非常快以致于循环没有及时读到这个改变的值.因此机械动作应该设置成Switch开关.现在当你按下布

C#并行编程

一.基于任务的程序设计 共享内存多核OS和分布式内存OS 共享内存多核OS-一个微处理器由多个内核组成,且每个内核共享一段私有内存: 分布式内存OS-- 由多个微处理器组成,每个微处理器可以有自己的私有内存,微处理器可以位于不同的计算机上,每个计算机可以有不同的通信信道 消息传递接口(MPI):运行在分布式内存计算机系统上的并行应用程序所使用的最流行的通信协议: 并行程序设计和多核程序设计 并行程序是指同一时刻运行多条指令,编写的代码能够充分利用底层硬件提供的并行执行能力:多核程序设计能够充分利

C#并行编程 z

目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 基于任务的程序设计.命令式数据并行和任务并行都要求能够支持并发更新的数组.列表和集合. 在.NET Framework 4 以前,为了让共享的数组.列表和集合能够被多个线程更新,需要添加复杂的代码来同步这些更新操作. 如您需要编写一个并行循环,这个循环以无序的方式向一个共享集合中添加元素,那么必须加入一个同步机制

Net并行编程高级教程--Parallel

Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机还是生物都并发处理着各种事物.人真是奇怪,当你关注一个事情的时候,你会发现周围的事物中就常出现那个事情.所以好奇心驱使下学习并发.便有了此文. 一.理解硬件线程和软件线程 多核处理器带有一个以上的物理内核--物理内核是真正的独立处理单元,多个物理内核使得多条指令能够

并行开发——Parallel的使用 -摘自网络

随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制, 要了解并行开发,需要先了解下两个概念:“硬件线程”和“软件线程”. 1. 硬件线程 相信大家手头的电脑都是双核以上的,像我这样古董的电脑都是双核的,这样的双核叫做物理内核. 硬件线程又叫做逻辑内核,我们可以在”任务管理器“中查看”性能“标签页,如下图,我们知道有2个硬件线程. 一般情况下,一个物理内核对应一个逻辑内核,比如我这里的2对2.当然如果你的cpu采用的是超线程技术,那么可

C#编程(六十四)----------并行扩展

并行的扩展 扩展1. Parallel的使用: 在Parallel下面有三个常用的方法Invoke,For,ForEach Parallel.Invoke()方法是最简单,最简洁的将串行的代码并行化. 在这里先说一点,就是Stopwatch的使用,Stopwatch到底是个什么东西,首先Stopwatch在命名空间System.Diagnostics中. 使用方法如下: var StopWatch =new Stopwatch();//创建一个Stopwatch实例 StopWatch.Star

理解并行编程

并行编程从业务实现的角度可分为数据并行与任务并行,也就是要解决的问题是以数据为核心还是以要处理的事情为核心.基于任务的并行编程模型TPL(任务并行库)是从业务角度实现的并行模型,它以System.Threading.Tasks命名空间下的Parallel类为实现核心类,优点是不需要我们考虑不同的硬件差异,只需要重点关注所实现的任务. 1.任务并行库TPL TPL主要包括数据并行和任务并行,无论是数据并行还是任务并行,都可以使用并行查询PLINQ提高数据查询的效率.数据并行是对数据集合中的元素同时