zoukankan      html  css  js  c++  java
  • Parallel.For 平行算法 使用

    之前看到Parallel的用法,觉得很高深,很腻害,今天专门抽空研究了一下,发现还是很easy的。

    .NET Framework 4.0 新加的功能,所以4.0之前的无法使用哦。

    下面介绍一下,Parallel称为 平行算法,用白话说,就是为了充分利用电脑多核处理器的优势,使得每隔核心都可以努力干活,不让他们闲着,来提高运行效率。

    不过使用需要注意几点:

    1:Parallel 并行处理时 如果涉及到共享资源的话,使用要很小心,因为并行同时访问共享资源,就会出现不确定的状态,非要使用,可以加锁来解决;

    2:Parallel中不管是For还是Foreach,处理都是乱序的,并不是按照顺序来处理,所以要当心;

    3:如果列表或者循环次数较少,不建议使用Parallel,因为创建线程资源之类的处理会浪费很多事件和资源;

    4:同样,如果内部处理逻辑非常简单,也不建议使用Parallel,因为创建资源的耗费并不值得,比较复杂的处理逻辑,可以考虑Parallel

    talk is cheap,show you code

            public static void parallelFunc()
            {
                DateTime startTime;
                TimeSpan resultTime;
                List<int> testList = new List<int>();
                for (int i = 0; i < 10; i++)
                {
                    testList.Add(i);
                }
                startTime = System.DateTime.Now;
                loop1(testList);
                resultTime = System.DateTime.Now - startTime;
                Console.WriteLine("一般for循环耗时:" + resultTime.TotalMilliseconds);
                startTime = System.DateTime.Now;
                loop2(testList);
                resultTime = System.DateTime.Now - startTime;
                Console.WriteLine("一般foreach循环耗时:" + resultTime.TotalMilliseconds);
                startTime = System.DateTime.Now;
                loop3(testList);
                resultTime = System.DateTime.Now - startTime;
                Console.WriteLine("并行for循环耗时:" + resultTime.TotalMilliseconds);
                startTime = System.DateTime.Now;
                loop4(testList);
                resultTime = System.DateTime.Now - startTime;
                Console.WriteLine("并行foreach循环耗时:" + resultTime.TotalMilliseconds);
                Console.ReadLine();
            }
    
            #region  Parallel 循环
            //普通的for循环
            static void loop1(List<int> source)
            {
                int count = source.Count();
                for (int i = 0; i < count; i++)
                {
                    System.Threading.Thread.Sleep(100);
                }
            }
    
            //普通的foreach循环
            static void loop2(List<int> source)
            {
                foreach (int item in source)
                {
                    System.Threading.Thread.Sleep(100);
                }
            }
    
            //并行的for循环
            static void loop3(List<int> source)
            {
                int count = source.Count();
                Parallel.For(0, count, index =>
                {
                    Console.WriteLine($"Parallel.For:{index}");
                    System.Threading.Thread.Sleep(100);
                });
            }
    
            //并行的foreach循环
            static void loop4(List<int> source)
            {
                Parallel.ForEach(source, item =>
                {
                    Console.WriteLine($"Parallel.ForEach:{item}");
                    System.Threading.Thread.Sleep(100);
                });
            }
    
            #endregion
        }
    View Code

    运行结果:

    可以看到,执行效率依次为:  Parallel.ForEach >  Parallel.For > 普通ForEach > 普通For,且Parallel是无序运行的

    具体效率应该取决于电脑的CPU核心数,我的是4核,所以大概是4倍左右

  • 相关阅读:
    (精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)
    优先队列底层实现是堆(heap)(操作系统进程调度)
    (透彻理解)最精锐代码::堆的三种基本操作新建-插入-删除
    (考研)读者写者问题(附代码)
    (考研)黑电吃苹果同步互斥问题(附代码)
    (考研)哲学家进餐问题(附代码)
    (考研)吸烟者问题(赋代码)
    (考研)PV操作和信号量
    01.第一章_C++ Primer学习笔记_开始
    C++学习笔记
  • 原文地址:https://www.cnblogs.com/wolfworker/p/7612196.html
Copyright © 2011-2022 走看看