热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

浅谈.Net并行计算之数据并行

这篇文章主要介绍了.Net并行计算之数据并行,有需要的朋友可以参考一下

从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在过去并行化需要线程的低级操作,难度很大,在.net4.0中的增强了对并行化的支持,使得这一切变得非常简单 。本次我从以下几个方面大家讲以下.NET 并行

1.      数据并行
2.      任务并行
3.      并行Linq
4.      任务工厂
5.      注意事项
    

  本次主要给大家讲一下数据并行 废话不说,下面开始了

   数据并行其实就是指对原集合或者数组中的数据进行划区之后分摊到多个CPU或者多个线程执行相同的操作 在 .net中的 System.Threading.Tasks 提供了对数据并行的支持类 , Parallel.For,Parallel.ForEach和我们经常的使用的for 和foreach 十分的相似,你不用创建线程队列,在基本的循环中你不用使用锁。这些.net 会帮你处理,你只需要关注你自己的业务  那下面我们就来看看 Parallel.For 和 Parallel.ForEach 是如何使用的

•     Parallel.For 简单使用

代码如下:

   Parallel.For(0, 100, i => {
                dosameting()
            });

上面的例子是不是和我们经常使用的for循环的影子。 说一下 Parallel.For 的第三个参数Action类型的委托 不管这个委托的参数是0个还是多少个他的返回植都是void,那么怎么样才能获取到Parallel.For 中的的返回值了,下面的例子将演示如何使用线程本地变量来存储和检索由 for 循环创建的每个单独任务中的状态  通过使用线程本地数据,您可以避免将大量的访问同步为共享状态的开销。  在任务的所有迭代完成之前,您将计算和存储值,而不是写入每个迭代上的共享资源。  然后,您可以将最终结果一次性写入共享资源,或将其传递到另一个方法

•对个list 进行求和我们这里假设List的长度为listLength

代码如下:

   Parallel.For(0, listLength, () => 0, (j, loop, subsum) =>
            {
                subsum += lista[j];
                return subsum;

            }, (x) => Interlocked.Add(ref sum, x));

•在现实中我们也经常会遇到需要取消循环的情况。比如你在队列中查找一个数。那么如何退出Parallel.For 循环了。是不是也是和for 和foreach那样 使用Break关键字就可以了,答案否定的。这是因为break 构造对循环是有效的,而并行循环其实是一个方法,并不是循环 那么要怎么样取消了。请看下面的例子

代码如下:

Parallel.For(0, listLength, () => 0, (j, loop, subsum) =>
            {
                if (subsum > 20000)
                {
                    loop.Break();
                }

                subsum += lista[j];
                return subsum;

            }, (x) => Interlocked.Add(ref sum, x));

• 简单Parallel.ForEach 循环     Parallel.ForEach循环的工作方式类似于 Parallel.For 循环 根据系统环境,对源集合进行分区,并在多个线程上计划工作。  系统中的处理器越多,并行方法的运行速度越快。  对于某些源集合,顺序循环可能更快,具体取决于源的大小和正在执行的工作类型

代码如下:

   Parallel.ForEach(lista, i => { dosameting(); });

 不知道大家在这个地方有没有看到foreach的影子。其实上面的例子中的ForEach方法的最后一个输入参数是 Action委托,当所有循环完成时,方法将调用该委托。这个地方和前面的Parallel.For 是一样的。那么我们要如何获得返回值了和上面的For是非常相似,我依然以上面数组求和为例

代码如下:

Parallel.ForEach(lista, () => 0, (j, loop, subsum) =>
       {
           if (subsum > 20000)
           {
               loop.Break();
           }

           subsum += lista[j];
           return subsum;

       }, (x) => Interlocked.Add(ref sum, x));

• Parallel.For 和for 性能测试比较 我们这里产生1千万个随机数为例子做个一个性能比较,在笔者的笔记本上结果如下 (可能在你的电脑上得到结果不一定相同)

附上相关的代码给大家参考

代码如下:

int listLength = 10000000;
            List listTask = new List();
            List list = new List();
            Stopwatch watch1 = Stopwatch.StartNew();

            Parallel.For(0, listLength, i => {
                Random r = new Random(100);
                listTask.Add(r.Next());

            });
            Console.WriteLine("并行耗时:" + watch1.ElapsedMilliseconds );
           

       
            Stopwatch watch2 = Stopwatch.StartNew();

            for (int i = 0; i             {
                Random r = new Random(100);
                list.Add(r.Next());
            }


            Console.WriteLine("非并行耗时:" + watch2.ElapsedMilliseconds );


推荐阅读
  • 人人租机作为国内领先的信用免押租赁平台,为企业和个人提供全方位的新租赁服务。通过接入支付宝小程序功能,该平台实现了从零到百的迅猛增长,成为全国首家推出“新租赁小程序”开发服务的阿里巴巴小程序服务商(ISV)。这一创新举措不仅提升了用户体验,还显著增强了平台的市场竞争力。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • 在Mac平台上通过终端操作完成MySQL的启动与彻底关闭——八步指南
    在Mac平台上,通过终端操作实现MySQL的启动与完全关闭,本文提供了一套详细的八步指南。首先,在Finder中使用快捷键进入 `/usr/local` 目录,找到并进入 `mysql` 文件夹。接着,右键选择该文件夹并从上下文菜单中打开终端。在终端中,输入并执行 `./scripts/mysql_install` 命令以开始安装或初始化过程。后续步骤将指导用户如何顺利启动和安全关闭MySQL服务,确保系统资源的有效管理。 ... [详细]
  • 江民科技在2月23日的病毒播报中提醒用户注意,今日检测到的病毒包括“网游窃贼”变种nln(TrojanPSW.OnLineGames.nln)和“Hosts劫持者”rj(TrojanQhost.rj)。这些恶意软件可能导致正常网页访问受限,并增加游戏账号被盗的风险。建议用户及时更新防病毒软件,加强系统安全防护,避免个人信息泄露。 ... [详细]
  • 深入解析 Redis 源码阅读方法与技巧
    在深入解析 Redis 源码的过程中,建议首先从数据结构的实现入手。这是因为在 Redis 的整体架构中,数据结构相关的代码与其他模块的耦合度较低,有助于初学者快速理解和掌握核心概念。通过阅读这些基础文件,可以为后续深入研究打下坚实的基础。 ... [详细]
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • D2iQ与Rafay联手打造统一的应用与基础设施管理解决方案
    D2iQ与Rafay合作推出了一种全面的应用和基础设施管理解决方案。本文深入探讨了双方如何通过集成技术实现统一管理,为面临类似挑战的企业提供详细的分析和实用建议,助力其高效管理和优化资源。 ... [详细]
  • Spring Boot 和 Spring Cloud 是 Spring 生态系统中的重要组成部分,各自具有独特的特性和应用场景。Spring Boot 通过简化配置和自动配置机制,显著提高了开发和部署效率,减少了传统 Spring 应用中繁琐的 XML 配置文件需求。而 Spring Cloud 则在此基础上进一步提供了分布式系统的解决方案,包括服务发现、配置管理、断路器等高级功能,适用于微服务架构的构建和管理。本文将深入探讨两者的核心差异,并分析其各自的最佳应用场景。 ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 在通过SSH连接到大学服务器中的指定主机时,系统会自动分配一台特定的计算机。为了确保连接顺利,用户需要了解正确的SSH命令格式和必要的配置步骤。此外,掌握如何查看分配的主机信息和进行身份验证也是关键。 ... [详细]
  • 本文分享了将物理服务器上的操作系统、应用软件及数据迁移到阿里云ECS服务器的实际经验。P2V迁移通过利用多种工具软件,将物理服务器的系统状态和数据完整地复制到虚拟磁盘中,确保在阿里云平台上顺利运行。该过程不仅涉及技术细节,还涵盖了迁移前的准备、迁移中的监控以及迁移后的验证等多个环节,为用户提供了一套全面的迁移方案。 ... [详细]
  • HTTP请求与响应机制:基础概览
    在Web浏览过程中,HTTP协议通过请求和响应报文实现客户端与服务器之间的通信。当用户访问一个网页时,浏览器会发送一个HTTP请求报文至服务器,服务器接收到请求后,会生成并返回一个HTTP响应报文。这两种报文均包含三个主要部分:起始行、头部字段和消息体,确保了数据的有效传输和解析。 ... [详细]
  • 如何在Linux系统中利用crontab定时执行Shell脚本任务?
    在Linux系统中,如何实现定时执行任务脚本?在服务器日常运维过程中,经常需要定期执行某些任务,例如数据库备份、日志文件切割等。通过使用crontab工具,可以轻松配置这些周期性任务,确保它们按时自动运行,提高系统管理效率和可靠性。 ... [详细]
author-avatar
ys2011一号_139
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有