zoukankan      html  css  js  c++  java
  • Parallel World 3 – Parallel Loop (2)

    I. Parallel.For

    Parallel.For共有12个重载的方法,这里不每个都讲,只说一个最基本的,其他的大家可以自己尝试。

    ParallelFor

    第一个参数, fromInclusive它可以是Int32型的也可以是Int64型的,注意它是inclusive的,也就是说它在循环体中会被用到,在顺序循环Refactor到并行循环时要注意这一点。

    第二个参数, toExclusive它可以是Int32型的也可以是Int64型的,注意它是exclusive的,也就是说它在循环体中不会被用到,在顺序循环Refactor到并行循环时要注意这一点。

    它们的区别就类似于下述代码中的0和100这两个值:

    ParallelFor1 

    第三个参数就是一个Action,它可以是Action<Int32>也可以是Action<Int64>

    对开篇中的代码使用Parallel.For后,可以得到下面代码:

       1: private static void ParallelQuadraticSum()
       2: {
       3:     double sum = 0;
       4:     var sw = Stopwatch.StartNew();
       5:     //for (int i = 0; i < NUM_MAX; i++)
       6:     //{
       7:     //    sum = sum + (2 * i + 1) * (i + 1) * i / 6;
       8:     //}
       9:  
      10:     Parallel.For(0, NUM_MAX, index => { sum = sum + (2 * index + 1) * (index + 1) * index / 6; });
      11:  
      12:     Console.WriteLine("QuadraticSum Excuation Time: {0}", sw.Elapsed.ToString());
      13:     //Console.WriteLine("Quadratic Result: {0}", sum);
      14:     //Debug.WriteLine(sw.Elapsed.ToString());
      15: }

    II. Parallel.Foreach

    对于Parallel.Foreach, 一看就能猜到它是用来处理集合类型的, 但是.NET 4对它进行了一定的扩展。

    1. 对于普通的foreach循环,一般都用在实现了IEnumerable接口的collection, 同样,对于Parallel.Foreach也可以用于实现了IEnumerable接口的集合。

    ParalleForeach

    第一个参数是一个实现了IEnumberable接口的data source

    第二个参数是一个action

       1: static void Main(string[] args)
       2: {
       3:  
       4:     List<string> BrowserList = new List<string> { "IE6", "IE8", "IE9", "Firefox", "Safari", "Chrome", "opera" };
       5:     Parallel.ForEach(BrowserList, item => { Console.WriteLine("The browser is: {0}",item); });
       6:  
       7:     Console.ReadLine();
       8: }

    2. 我们还可以把一个集合里的数据先分成一个一个块,在每一个块里,我们让系统顺序的执行,但是块之间并行执行。

    这时候我们需要使用另一个很重要的命名空间中的一个类System.Collections.Concurrent.Partitioner - 分块器.

    注意,在这里我们仅仅演示了如何使用分块器;读者要牢记在第一篇文行中提到的两个问题。

       1: static void Main(string[] args)
       2:    {
       3:  
       4:        double sum = 0;
       5:  
       6:        Parallel.ForEach(System.Collections.Concurrent.Partitioner.Create(1, NUM_MAX), rang =>
       7:        {
       8:            for (int i = rang.Item1; i < rang.Item2; i++)
       9:            {
      10:                sum = sum + Math.Pow((i * (i + 1) / 2), 2);
      11:            }
      12:        });
      13:  
      14:        Console.ReadLine();
      15:    }
  • 相关阅读:
    云中树莓派(5):利用 AWS IoT Greengrass 进行 IoT 边缘计算
    乐观锁 与 悲观锁 来解决数据库并发问题
    Python二维数组构造
    一次问题追查----短字符串签名算法引发的bug
    C++ assert 断言使用
    并查集(Union-Find)算法
    linux shell grep/awk/sed 匹配tab
    C++ 变量默认初始值不确定(代码测试)
    linux 查看机器内存方法 (free命令)
    html table奇偶行颜色设置 (CSS选择器)
  • 原文地址:https://www.cnblogs.com/wildboar/p/2067799.html
Copyright © 2011-2022 走看看