.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(一)
2023-09-14 08:58:21 时间
随着CPU多核的普及,编程时充分利用这个特性越显重要。本文首先用传统的嵌套循环进行数组填充,然后用.NET 4.0中的System.Threading.Tasks提供的Parallel Class来并行地进行填充(当然这里也用到嵌套循环),通过对比发现其中差异。主要内容如下:
通常的数组填充 并行的组数填充 性能比较 System.Threading.Tasks分析,这个将在续篇.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(二)中介绍 1、通常的数组填充首先看如下代码:
using System; namespace ParallelForSample public class SingleCore public static void Calculate(int calcVal) Utility util = new Utility(); util.Start(); int[,] G = new int[calcVal, calcVal]; for (int k = 0; k calcVal; k++) for (int i = 0; i calcVal; i++) for (int j = 0; j calcVal; j++) G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]); util.Stop(); }上面的粗体红色显示的几行代码就是实现数组填充,这个很好理解不用多费口舌。补充说明的是:上面的Utility是为了统计性能而编写的一个类,它主要就是用到了Stopwatch对象——它提供一组方法和属性,可用于准确地测量运行时间。Utility的代码如下:
public class Utility private Stopwatch _stopwatch; public void Start() _stopwatch = new Stopwatch(); _stopwatch.Start(); public void Stop() _stopwatch.Stop(); TimeSpan ts = _stopwatch.Elapsed; string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); Console.WriteLine("Time taken : {0}", elapsedTime); }利用它我们就可以对数组填充所耗费的时间进行计算了。 2、并行的组数填充
为了充分利用CPU的多核,我们编写如下代码:
using System; using System.Threading.Tasks; namespace ParallelForSample public class MultiCore public static void Calculate(int calcVal) Utility util = new Utility(); util.Start(); int[,] G = new int[calcVal, calcVal]; Parallel.For(0, calcVal, delegate(int k) Parallel.For(0, calcVal, delegate(int i) for (int j = 0; j calcVal; j++) G[i, j] = Math.Min(G[i, j], G[i, k] + G[k, j]); util.Stop(); }
留意上面的红色粗体显示的几行代码,它利用了Parallel.For Method (Int32, Int32, Action Int32 )方法,Parallel类位于命名空间System.Threading.Tasks中,它支持并行循环。此Parallel.For方法使得它里面的迭代可能并行地运行,注意到上述代码中它的第三个参数是一个委托。在(0,calcVal)之间,这个委托将被调用。
3、性能比较现在我们来测试一下,上面两种方法的执行性能差异如何,下载源码。其实,核心代码已经在上面贴出来了,现在注意是编写实例来测试,代码主要如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ParallelForSample class Program static void Main(string[] args) Console.WriteLine("Single core"); SingleCore.Calculate(1000); Console.WriteLine("Multi core"); MultiCore.Calculate(1000); Console.WriteLine("Finished"); Console.ReadKey();
运行之后得到如下结果:(不同电脑配置不同,得出结果不同)
图1、性能比较
从结果可以看出,并行的数组填充比通常的数组填充性能更高。
System.Threading.Tasks分析,这个将在续篇.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(二)中介绍……
.Net线程同步技术解读 C#开发者(面试者)都会遇到lock(Monitor),Mutex,Semaphore,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别。
.Net Mirco Framework 2007技术大会 最近公司很多项目都有大量嵌入式设备使用,由于WinCE系统相对较大,对硬件平台要求过高,所以对.Net MF一直比较关注。今天总算大开眼界了
[.NET]使用十年股价对比各种序列化技术 原文:[.NET]使用十年股价对比各种序列化技术 1. 前言 上一家公司有搞股票,当时很任性地直接从服务器读取一个股票10年份的股价(还有各种指标)在客户端的图表上显示,而且因为是桌面客户端,传输的数据也是简单粗暴地使用Soap序列化。
【福州活动】| 福州首届.NET开源社区线下技术交流会 (2018.11.10) 阅读目录 【活动介绍】 微软爱开源,已是尽人皆知的事实。自从收购全球最大的开源社区 GitHub 之后,微软依旧使 GitHub 保持独立运营,并且通过此项举措,微软本身已经成为最大的社区服务者。
微服务定义及.Net Core中用的技术 它是一种架构模式,提倡将大的单体系统,按业务拆分成一个个较小且独立的服务,服务与服务之前进行相互协作和配合。 针对互联网行业的蓬勃发展,需要支撑的业务越来越多,越来越大,单体程序越来越难以支撑,因此才出现了微服务的这种架构。
相关文章
- .NET(c#) 移动APP开发平台 – Smobiler(1)
- C#编写单片机上位机软件-串口通讯(BMS汽车动力电池管理系统)
- c# savefiledialog_game是什么意思中文
- c# openfiledialog如何使用_visual studio怎么保存源代码
- 【愚公系列】2023年02月 .NET/C#知识点-区块链概念和实现
- 【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )
- 【c#表达式树】最完善的表达式树Expression.Dynamic的玩法
- .net安装 Linux 上的 ASP.NET 环境(linux安装asp)
- C# 实现QQ群成员列表导出及邮件群发之模拟QQ登陆
- .net下的数据库连接SQLServer驱动在.NET平台下的数据库连接简明介绍(sqlserver驱动在)
- 使用Net实现Oracle数据库的快速导入(net导入oracle)
- NET与MySQL的无限结合(.net 连接mysql)
- 使用NET来连接MySQL数据库的简单方法(.net怎么连mysql)
- 网上解决Net环境下MySQL数据库的同步问题(.net 同步mysql)
- C#实现图片分割方法与代码
- c#.net多线程编程教学——线程同步
- asp.net(c#)ubb处理类
- ASP.NET(C#)应用程序配置文件app.config/web.config的增、删、改操作
- asp.net(C#)动态添加非ASP的标准html控件(如添加Script标签)
- 在asp.net(c#)下实现调用cmd的方法
- C#与.net高级编程C#的多态介绍
- C#利用ScriptControl动态执行JS和VBS脚本
- C#归并排序的实现方法(递归,非递归,自然归并)
- C#基础:Dispose()、Close()、Finalize()的区别详解
- 基于c#类、接口、结构的联系与区别详解
- ASP.NET(C#)验证数字的两种方法
- C#判断文件路径是否存在或者判断文件是否存在的方法
- c#泛型学习详解创建线性链表
- c#获得目标服务器中所有数据库名、表名、列名的实现代码
- C#数组实例介绍(图文)