微软并行编程类库Parallel Extensions初探 Part1
概述
Microsoft Parallel Extensions to the .NET Framework 3.5是一个托管编程模型,用于数据并行化和任务并行化,并可对统一在共同的工作调度程序之下的并行硬件进行协调。 Parallel Extensions to the .NET Framework 3.5使开发者更容易编写出充分发挥并行硬件的优势的程序,不但能随着处理器数量的增长而提高性能,而且避免了许多旧有并发编程模型的复杂性。
你可以从这里下载Microsoft Parallel Extensions to the .NET Framework 3.5 June 2008 CTP版本,安装后会注册一个System.Threading.dll程序集到GAC中。Parallel Extensions主要由两部分组成:Task Parallel Library(TPL)和Parallel LINQ (PLINQ),它们将会集成在.NET Framework 4.0中。
简单调用
在开始之前,我们不妨停下来思考几个问题:如果有多个线程在同一时间访问同一个变量,它们之间可能会互相影响,该如何解决?如果有多个线程同时锁住了一些资源,由于互相等待而造成死锁,该如何解决?如果觉的这些问题很难解决,那就不要思考了,有了Parallel.Invoke,无需再去考虑这些令人头疼的问题,我们先定义三个任务:
private void Task1() {Thread.Sleep(1000); } private void Task2() {Thread.Sleep(2000); } private void Task3() {Thread.Sleep(3000); }
并行调用这三个任务,只需要一句话:
Parallel.Invoke(Task1, Task2, Task3);
除此之外,还可以把所有的任务放在一个Action数据组中,再进行调用,如下代码片段,这在某些场景中会非常的有用,我们在设计阶段无需考虑最终运行时将会有多少个任务会执行:
Action[] actions = { Task1, Task2, Task3 }; Parallel.Invoke(actions);
我们不妨对Parallel.Invoke做一个简单的测试,如下代码片段所示:
private long InvokeSequential() {Stopwatch watch = new Stopwatch();watch.Start();Task1();Task2();Task3();watch.Stop();return watch.ElapsedMilliseconds; }private long InvokeParallel() {Stopwatch watch = new Stopwatch();watch.Start();Parallel.Invoke(Task1, Task2, Task3);watch.Stop();return watch.ElapsedMilliseconds; }private long InvokeParallelArray() {Stopwatch watch = new Stopwatch();watch.Start();Action[] actions = { Task1, Task2, Task3 };Parallel.Invoke(actions);watch.Stop();return watch.ElapsedMilliseconds; }
来看看最后的结果:
循环调用
循环执行某件事情应该是我们编程中经常遇到的问题,但是之前所有的循环只能顺序的进行执行,如下面这段代码,再平常不过了:
for (int i = 0; i < 10; i++) {Compute(i); }
在Parallel Extensions中,可以使用Parallel.For来并行的执行循环任务:
Parallel.For(0, 10,delegate (int i){Compute(i);});
甚至有了Lambda表达式,还可以更简单的编写为:
Parallel.For(0, 10,i => { Compute(i);});
现在,我们再来做一个简单的测试,代码如下:
private static long SequentialForLoop() {Stopwatch watch = new Stopwatch();watch.Start();for (int i = 0; i < 10; i++){Compute(i);} watch.Stop();return watch.ElapsedMilliseconds; }private static long ParallelForLoop() {Stopwatch watch = new Stopwatch();watch.Start();Parallel.For(0, 10,i => { Compute(i);});watch.Stop();return watch.ElapsedMilliseconds; }private static void Compute(int i) {Thread.Sleep(200 * i); }
测试结果如下:
类似的在Parallel中还提供了Parallel.ForEach方法,如下图所示:
我们使用类似于如下的代码来使用该方法:
List<int> data = new List<int> { 1, 2, 3, 4, 5 }; Parallel.ForEach(data,i => { Compute(i); });
总结
以上简单的介绍了Task Parallel Library中的Parallel, 希望对大家有所帮助
转载于:https://www.cnblogs.com/liufei88866/archive/2013/06/13/3133641.html
微软并行编程类库Parallel Extensions初探 Part1相关推荐
- C#中的多线程 - 并行编程 z
原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加 ...
- 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...
- 深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...
- linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...
摘要: <微软技术丛书:Visual Studio2010并行编程从入门到精通>循序渐进,步骤式动手练习迅速帮助读者掌握并行编程的基础知识. <微软技术丛书:Visual Studi ...
- C#并行编程中的Parallel.Invoke
一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...
- 如何运用并行编程Parallel提升任务执行效率
本文来自小易,[DoTNET技术圈]公众号已获得转载授权. <.NET并发变成实战>读后感:并行编程Parallel 手打目录: 一.前言 二.任务并行库(TPL)的介绍 三.Parall ...
- 【读书笔记】.Net并行编程高级教程--Parallel
一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...
- PPL 和AMP并行编程
根据我的理解,PPL是指Parallel Patterns Library,这是微软为了提出并行计算(就是现在的C++ AMP)而在Visual Studio2010中引入的提供了类似于标准模板库 ( ...
- 多核时代,并行编程为何“臭名昭著”?
作者 | Yan Gu 来源 | 转载自知乎用户Yan Gu [导读]随着计算机技术的发展,毫无疑问现代计算机的处理速度和计算能力也越来越强.然而细心的同学们可能早已注意到,从2005年起,单核的 C ...
最新文章
- IPTABLES封闭和开放端口
- 为什么刹车热了会失灵_网曝比亚迪汉“刹车失灵”,比亚迪称:是IPB模块仪表显示问题...
- 1. 根据输出的数据,对各个阶维度的反推+2.tf中生成根据指定的shape,tensor的各个阶的维度判断
- iw命令 linux 没有_linux学习笔记(实验楼) 实验2 基本概念和操作
- keras可视化模型
- 通过Java技术手段,某程序员发现自己被绿了!
- Editplus破解
- Windows10彻底关闭休眠功能
- android吉他谱组件,Paranoid Android drum吉他谱
- chrome证书错误问题
- 手机投屏到电脑的实用工具
- 《AngularJS深度剖析与最佳实践》一1.6 实现AOP功能
- c++和java学哪个好,c++和java区别 学哪个比较好
- 敏捷开发之XP极限编程
- CTF-AWD入门手册
- 经典SQL学习笔记 (四)-子查询
- CSS进阶之关于网格布局(Grid) 你了解哪些
- 安科瑞Acrel-BUS智能照明控制系统在医院的应用
- Pulsar Summit Asia 2022 议题征集令,倒计时十天提交演讲议题
- anychat-极简纯净的websocket聊天插件推荐
热门文章
- socket通信简单介绍
- java中保留两位小数(四舍五入后)
- 利用MYSQL的函数实现用户登录功能,进出都是JSON(第一版)
- 主成分分析PCA(principal component analysis)原理
- 简单入门——深度学习笔记(Part II)
- jQuery的筛选选择器
- mycncart操作使用教程 - 横幅广告
- Simics系统模拟器
- 加入域时遇到“找不到网络路径”错误解决办法汇总
- Java.lang.IllegalStateException Activity has been destroyed