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
    }

运行结果:

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

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

时间: 2024-10-12 15:36:04

Parallel.For 平行算法 使用的相关文章

Parallel Computing–Cannon算法 (MPI 实现)

原理不解释,直接上代码 代码中被注释的源程序可用于打印中间结果,检查运算是否正确. #include "mpi.h" #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void scatter_matrix(int* fstream,int n1,int n2,int*Q,int root,int tag){ /*每个矩阵块的大小*/

[算法]位运算问题之一

一.不用额外变量交换两个整数的值 a=a^b; b=a^b; a=a^b; 或者: a=a+b; b=a-b; a=a-b; 二.不同任何比较判断找出两个数中较大 有两种方法,方法一有一定的局限性,a-b的值可能溢出,这样溢出后符号改变,返回结果就不正确. 而方法二对a和b是否异号进行了判断,如果同号,则按照方法一返回,否则直接返回正的数就行. a-b的值如果为0的处理按照大于0处理. //如果n为1,则返回0:如果n为0,则返回1 public static int flip(int n) {

MLlearning(2)——simHash算法

这篇文章主要讲simHash算法.这是一种LSH(Locality-Sensitive Hashing,局部敏感哈希)的简单实现.它是广泛用于数据去重的算法,可以用于相似网站.图片的检索.而且当两个样本差别并不大时,算法仍能起效.值得一提的是,该算法的时空复杂度不存在与维度有关的项,所以不会遭遇维度灾难,也可以在维数较高时优化kNN算法. 特征 此算法(LSH)具有双重性,它们似乎是相悖的: 对于几组不同的特征,hash相同(即冲突)的可能性要尽可能小.这也是hash基本的特征. 对于几组相似的

Pyecharts : plot Graph, Line, Liquid, Parallel

报错:ascii' codec can't decode byte 0xe5 in position 2877: ordinal not in range... 主要错误是上面最后一行的Unicode解码问题,网上搜索说是读取文件时使用的编码默认时ascii而不是utf8,导致的错误: 在代码中加上如下几句即可. import sys reload(sys) sys.setdefaultencoding('utf8')  2017-07-27 作者陈键冬 Python中文社区 ?陈键冬,Pyth

算法设计手册(第2版)读书笔记, Springer - The Algorithm Design Manual, 2ed Steven S.Skiena 2008

The Algorithm Design Manual, 2ed 跳转至: 导航. 搜索 Springer - The Algorithm Design Manual, 2ed Steven S.Skiena 2008 目录 1 介绍 2 算法设计 3 数据结构 4 排序和搜索 5 图遍历 6 加权图 7 组合搜索与启发式 8 DP 9 Intractable问题与近似算法 10 怎样设计算法 11 数据结构 12 数值问题 13 组合问题 14 图问题:P 15 图问题:困难的 16 计算几何

JVM垃圾算法及回收器

说到JVM垃圾回收,我们通常会问三个问题,回收对象是什么?什么时候回收?怎么回收?JVM垃圾回收主要回收的区域是Java堆,通过了解JVM内存结构,我们知道堆主要负责对象和数组的存储.堆还可以进行细分. 一.堆内存分类 1. 新生代 - 新对象进入新生代,新生代可以分为三个区域 eden -新对象首先进入的区域 from survior -新生代另外一个区域 to survior -同上 2. 老年代old generation -- 在新生代中经历了N次垃圾回收后仍然存活的对象就会被放到老年代

使用面向对象抽取业务算法

描述 前面我们已经对领域内的名词进行了抽取,并且已经确定了业务流程中参与的核心对象. 但是对象只是静态的描述,系统中往往会有很多的业务操作,偏算法的,之前我们说过 领域内的对象往往是比较稳定不怎么变化的,但是,业务的流程以及业务操作这些是往往 千变万化,防不胜防,那么我们如何去及时发现这些系统内变化点,并且如何使用面向对象 的方式去抽象,封装它呢?,下面就简单介绍我们大神的一些个人经验,也在此记录一下. 目的 关注系统中的变化点或者说业务的流程中某个节点的多变的算法, 提供系统的可维护性和扩展性

单词(11)

parallel英 ['p?r?lel]美 ['p?r?l?l] n. 平行线:对比 adj. 平行的:类似的,相同的 vt. 使-与-平行 更多释义>> [网络短语] Parallel 平行,并行,平行 Parallel evolution 平行演化,平行进化,平行演化 Parallel algorithm 平行演算法,并行算法,并联算法 Serial / Serial Old 收集器 serial英 ['s??r??l]美 ['s?r??l] n. 电视连续剧:[图情] 期刊:连载小说 a

Java——JVM篇——收藏系列来啦(三)

2.7.GC 垃圾收集器Java 堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法:年老代主要使用标记-整理垃圾回收算法,因此 java 虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK1.6 中 Sun HotSpot 虚拟机的垃圾收集器如下: 2.7.1. Serial 垃圾收集器(单线程.复制算法)Serial(英文连续)是最基本垃圾收集器,使用复制算法,曾经是JDK1.3.1 之前新生代唯一的垃圾收集器.Serial 是一个单线程的收集器,它不