Parallel并行编程

Parallel并行编程可以让我们使用极致的使用CPU。并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片。而并行编程则是多CPU核心同时工作。耗时的CPU计算操作选择并行是明智的。通常情况,每个CPU核心代表一个硬件线程,但超线程技术,可以使一个cpu核心具有两个硬件线程。软件线程顾名思义就是我们在程序中所开启的。

下面看一个最基础的并行编程的例子,也足以体现多核心并行运行的好处,当然微软.NET为我们封装后,我们也不必过多关注底层操作,那我们就看一下运行结果。

static void Main(string[] args)
{
#region 实验1 var watch = Stopwatch.StartNew(); watch.Start(); FirstOption(); SecondOption(); Console.WriteLine("串行编程耗时:{0}", watch.ElapsedMilliseconds); watch.Restart(); Parallel.Invoke(FirstOption, SecondOption); watch.Stop(); Console.WriteLine("并行编程耗时:{0}", watch.ElapsedMilliseconds); Console.Read();
} static void FirstOption()
{
//假装CPU耗时操作
Console.WriteLine("我在时间{0}开始",DateTime.Now);
Thread.Sleep(3000);
Console.WriteLine("我是任务一,耗时3s"); } static void SecondOption()
{
//假装CPU耗时操作
Console.WriteLine("我在时间{0}开始", DateTime.Now);
Thread.Sleep(5000);
Console.WriteLine("我是任务二,耗时5s"); }

看完结果,相信不用我说,你也明白了,并行操作由多核心同时操作。

可能你会问如果我需要执行十几个类似于示例中的Option方法怎么办,那就要看你的核心数量了,如果核心数量不足,并不是所有的操作都是同一秒进行的。

代码就不上了,就是弄了11个option,可以看出我的配置很菜,有些时候同一秒开启只两个option,原因就是另外的option耗时比较长,在占用状态。

下面将介绍Parallel的For循环。并限制其能使用的硬件线程个数。

代码如下:


 var bag = new ConcurrentBag<int>();
GC.Collect();
watch.Start(); ParallelOptions options = new ParallelOptions(); //设置硬件线程数
options.MaxDegreeOfParallelism = 1;
//options.MaxDegreeOfParallelism = 2;
//options.MaxDegreeOfParallelism = 3;
//options.MaxDegreeOfParallelism = 4; Parallel.For(0, 20000000, options, i =>
{
bag.Add(i);
});
//for (int i = 0; i < 20000000; i++)
//{
// bag.Add(i);
//}
watch.Stop();
Console.WriteLine("并行计算:集合有:{0},使用的时间:{1}", bag.Count, watch.ElapsedMilliseconds);
Console.ReadKey();


我分别使用1,2,3个硬件线程数和4个硬件线程数作比较。效果很明显!

关于Parallel的For循环,实际上和我们普通的串行编程功能一样,只不过在并行编程中,.NET底层帮助我们大限度的使用了CPU而已。如果你不限制硬件线程数,通常会尽最大可能使用资源。

同时我也测试了串行代码。

另外受环境影响,并行的优势并非绝对。

 

Parallel并行编程的更多相关文章

  1. Parallel并行编程初步

    Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选 ...

  2. C# IEnumerable,Lambda表达式和 Parallel并行编程的用法

    以前一直主要做C++和C方面的项目,对C#不太了解熟悉,但听说不难,也就一直没有在意学习C#方面的知识.今天有个C#项目,需要做些应用的扩展,同时修改一些bug.但看了C#代码,顿时觉得有些不适应了. ...

  3. .Net并行编程

    1.什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2.什么是多线程?为什么设计多 ...

  4. C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)

    返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...

  5. 【读书笔记】.Net并行编程高级教程--Parallel

    一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...

  6. C#并行编程-Parallel

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  7. C#并行编程中的Parallel.Invoke

    一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...

  8. Net并行编程高级教程--Parallel

    Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控 ...

  9. C#并行编程--命令式数据并行(Parallel.Invoke)

    命令式数据并行   Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的.然而,因为他们包括了完整的新的特性,开 ...

随机推荐

  1. C语言 中缀转后缀

    给定字符串型的算术表达式,实现中缀转后缀并运算得出结果: #ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #include <stdio.h& ...

  2. BZOJ 1017 魔兽地图DotR(树形DP)

    题意:有两类装备,高级装备A和基础装备B.现在有m的钱.每种B有一个单价和可以购买的数量上限.每个Ai可以由Ci种其他物品合成,给出Ci种其他物品每种需要的数量.每个装备有一个贡献值.求最大的贡献值. ...

  3. C++ crash 堆栈信息获取(三篇文章)

    最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...

  4. linux xargs 使用

    xargs是一条Unix和类Unix操作系统的常用命令.它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题[1]. 例如,下面的命令: rm `find /path -type ...

  5. 记一次 java程序优化

    优化原因 环境中部署两个程序: web应用 tomcat   10G(webservice服务端,前端web服务) java应用               5G(webservice客户端,sock ...

  6. 【转】Linux下Android ADB驱动安装详解

    原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比 ...

  7. OpenWrt openssl library

    Please install the openssl library (with development headers) sudo apt-get install libssl; rite fail ...

  8. poj 1017 Packets 贪心

    题意:所有货物的高度一样,且其底面积只有六种,分别为1*1 2*2 3*3 4*4 5*5 6*6的,货物的个数依次为p1,p2,p3,p4,p5,p6, 包裹的高度与货物一样,且底面积就为6*6,然 ...

  9. 计算直线的交点数(set + 打表)

    计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  10. Struts1——从BeanUtils看struts的实现原理2

        上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用.     首先我们先回想一下搭建一个简单的基于Struts1框架的 ...