zl程序教程

您现在的位置是:首页 >  后端

当前栏目

.NET(C#) Internals: 以一个数组填充的例子初步了解.NET 4.0中的并行(一)

c#Net数组 一个 了解 例子 并行 初步
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();

运行之后得到如下结果:(不同电脑配置不同,得出结果不同)

image图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中用的技术 它是一种架构模式,提倡将大的单体系统,按业务拆分成一个个较小且独立的服务,服务与服务之前进行相互协作和配合。 针对互联网行业的蓬勃发展,需要支撑的业务越来越多,越来越大,单体程序越来越难以支撑,因此才出现了微服务的这种架构。