Parallel.For 平行算法 使用_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Parallel.For 平行算法 使用

Parallel.For 平行算法 使用

 2017/9/29 18:43:10  阿祖哥  程序员俱乐部  我要评论(0)
  • 摘要:之前看到Parallel的用法,觉得很高深,很腻害,今天专门抽空研究了一下,发现还是很easy的。.NETFramework4.0新加的功能,所以4.0之前的无法使用哦。下面介绍一下,Parallel称为平行算法,用白话说,就是为了充分利用电脑多核处理器的优势,使得每隔核心都可以努力干活,不让他们闲着,来提高运行效率。不过使用需要注意几点:1:Parallel并行处理时如果涉及到共享资源的话,使用要很小心,因为并行同时访问共享资源,就会出现不确定的状态,非要使用,可以加锁来解决;2
  • 标签:for 使用 all 算法

之前看到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

class="code_img_closed" src="/Upload/Images/2017092918/0015B68B3C38AA5B.gif" alt="">
        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
    }
logs_code_collapse">View Code

 

运行结果:

 

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

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

 

发表评论
用户名: 匿名