首页 > 其他分享 >用上Parallel让你的.NET应用效率飙升

用上Parallel让你的.NET应用效率飙升

时间:2023-11-29 13:35:43浏览次数:27  
标签:编程 并行 飙升 num ForEach NET Parallel

简介

.NET Framework 和 .NET Core 提供了强大的并行编程支持,其中一个核心工具就是Parallel类。Parallel类是.NET Framework4.0推出的新特性。Parallel类使得在多核系统上执行并行操作变得更加简单和高效。通过并行编程,可以充分利用现代计算机系统的硬件资源,提高应用程序的性能。本文将介绍它的几种功能。

一、Parallel库的主要功能

1、并行循环

Parallel.ForEach和 Parallel.For方法允许开发人员方便地并行遍历集合或执行一定数量的迭代。这使得处理大规模数据集时,特别是在迭代操作中,能够更快地完成任务。 在执行过程中会涉及多线程,因为它被设计用于并行处理集合中的元素。在这个过程中,它们会根据系统的可用处理器核心数量自动创建并管理多个线程,每个线程负责处理集合中的一个子集。

List<int> numbers = Enumerable.Range(1, 1000000).ToList();

Parallel.ForEach(numbers, (num) =>
{
    // 执行并行操作
    Console.WriteLine(num);
});

2、 PLINQ(Parallel LINQ)

PLINQ 是 Parallel Language-Integrated Query 的缩写,它允许在 LINQ 查询中应用并行化。通过使用 `AsParallel()` 方法,可以将普通的 LINQ 查询转换为并行查询,从而提高查询性能。

var result = from num in numbers.AsParallel()
             where num % 2 == 0
             select num;

3、并行任务

Parallel.Invoke方法允许同时执行多个委托,无需等待它们全部完成。这对于执行多个独立任务的场景非常有用。

Parallel.Invoke(
    () => DoTask1(),
    () => DoTask2(),
    () => DoTask3()
);

4、数据分区

Parallel.ForEach 和 Parallel.For方法允许指定数据分区方式,从而更好地控制并行执行的方式。通过使用 Partitioner类,可以实现更灵活的数据分区策略。

var partitioner = Partitioner.Create(numbers, true);
Parallel.ForEach(partitioner, (num) =>
{
    // 执行并行操作
    Console.WriteLine(num);
});

并行编程的Parallel.ForEach 和 Parallel.For方法有它们的异步方法Parallel.ForEachAsync和Parallel.ForAsync,大家可以根据项目情况来调用。需要注意的是ForEachAsync仅支持.NET6以上版本,Parallel.ForAsync仅支持刚发布的.NET 8。

二、Parallel的原理

Parallel库是.NET中的一个强大工具,它的实现基于工作窃取算法、任务分解、并发集合和线程池等关键技术。通过将任务分解为多个子任务,并采用工作窃取算法实现任务的高效调度,Parallel库有效地利用了系统的多核处理能力。此外,它提供了对并发集合的支持,避免了多线程访问时的潜在问题。通过这些机制,Parallel库简化了并行编程的复杂性,使开发人员能够以更轻松的方式利用并行性,提高应用程序的性能和响应能力,而无需深入处理底层线程管理的细节。

三、使用案例

图像处理

考虑一个图像处理的场景,我们需要对一批图像进行模糊处理。传统的串行方法可能会导致处理时间过长,而使用并行编程可以显著提高处理速度。

public void BlurImages(List<Image> images)
{
    Parallel.ForEach(images, (image) =>
    {
        // 调用图像处理库进行模糊处理
        ImageProcessor.Blur(image);
    });
}

在这个例子中,Parallel.ForEach使得每张图片都可以在不同的处理单元上并行执行模糊处理操作,从而提高处理图片效率。

结语

通过.NET中的Parallel库,开发人员可以更轻松地利用多核系统的性能优势,提高应用程序的并行处理能力。并行编程不仅能够简化代码,还能显著提高程序的执行效率,特别是在处理大规模数据集或执行密集计算任务时。合理使用Parallel库,可以使应用程序更具扩展性、响应性和性能。

虽然Parallel类为并行编程提供了便利性,但也伴随着一些潜在缺点。这包括调试的复杂性,因为并行程序可能引入难以追踪的问题,线程安全性的挑战,需要小心管理共享数据的访问,以及性能开销的可能性,包括线程创建和上下文切换。并行编程还引入了代码的复杂性,可能导致死锁、饥饿和任务划分不均等问题。在使用Parallel时,开发人员需要根据项目情况酌情使用。

希望本文.NET开发者有所帮助,对于.NET的Parallel并行编程你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、微软官网:learn.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.parallel?view=net-8.0

2、AI查询

推荐阅读

1、C#并发实战Parallel.ForEach使用性能

2、C#Parallel.Invoke的使用方法

3、面试必备:聊聊C#中Parallel和ParallelQuery的用法

来源公众号:DotNet开发跳槽❀    

标签:编程,并行,飙升,num,ForEach,NET,Parallel
From: https://www.cnblogs.com/xbhp/p/17864559.html

相关文章

  • .Net中C# DateTime类的ToString()方法的使用
    Console.WriteLine("ToShortDateString:"+DateTime.Now.ToShortDateString());Console.WriteLine("ToLongDateString:"+DateTime.Now.ToLongDateString());Console.WriteLine("ToShortTimeString:"+DateTime.Now.ToShortTimeString()......
  • ASP.NET的EXCEL批量导入操作
    前端代码:<tdclass="auto-style74"style="text-align:right"><asp:FileUploadID="FileUpload"runat="server"/><asp:LabelID="notice"runat="server&......
  • NS-3源码学习(四)wifi-ent-network.cc
    NS-3源码学习(四)wifi-ent-network.cc设定的参数booludp{true};udp/tcp通信选择booldownlink{true};AP->STA:downlink=true/STA->AP:downlink=false数据发送方向选择booluseExtendedBlockAck{false};启用扩展块确认,默认不启用,即块确认的大小为64,启用......
  • 论文:FEED-FORWARD NETWORKS WITH ATTENTION CAN SOLVE SOME LONG-TERM MEMORY PROBLEM
    题目:FEED-FORWARDNETWORKSWITHATTENTIONCANSOLVESOMELONG-TERMMEMORYPROBLEMS”(Raffel和Ellis,2016,p.1)“带有注意力的前馈网络可以解决一些长期记忆问题”(Raffel和Ellis,2016,p.1)(pdf)这篇论文提出了一种适用于前馈神经网络的简化注意力模型,并展示了......
  • 20231128 - 重启Centos后无法远程连接,重启网络服务报错:Error:Failed to start LSB: Br
    1.https://blog.csdn.net/m0_74953387/article/details/1329143062.https://blog.csdn.net/weixin_45894220/article/details/130487066......
  • .NET生成微信小程序推广二维码
    前言对于小程序大家可能都非常熟悉了,随着小程序的不断普及越来越多的公司都开始推广使用起来了。今天接到一个需求就是生成小程序码,并且与运营给的推广图片合并在一起做成一张漂亮美观的推广二维码,扫码这种二维码就可以进入小程序。为了节省服务器内存资源,我想的就是成功调用通微......
  • .NET中有多少种定时器
    .NET中至少有6种定时器,每一种定时器都有它的用途和特点。根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器。本文将简单介绍这6种定时器的基本用法和特点。UI定时器.NET中的UI定时器主要是WinForm、WPF以及WebForm中的定时器。分别为:System.Windows.Forms.TimerS......
  • The Hello World of Deep Learning with Neural Networks
    TheHelloWorldofDeepLearningwithNeuralNetworksdlaicourse/Course1-Part2-Lesson2-Notebook.ipynbatmaster·lmoroney/dlaicourse(github.com)编写这样一个函数的代码:floathw_function(floatx){floaty=(2*x)-1;returny;}Impor......
  • kubernetes集群使用容器镜像仓库Harbor
    1、容器镜像仓库Harbor部署在docker主机部署Harbor,安装过程比较简单在k8s集群中部署Harbor2、使用Harbor仓库2.1通过secret使用Harbor仓库新建私有仓库集权所有节点配置harbor仓库#cat/etc/docker/daemon.json{"exec-opts":["native.cgroupdriver=system......
  • NetBird 开源网络管理平台 部署安装
    NetBird简介NetBird是一个建立在WireGuard之上的开源网络管理平台,它允许计算机、设备和服务器通过快速加密隧道直接连接,无需配置或中央V*N服务器。它使专用网络变得安全,并创建了一个专用网络,在没有手动配置和专家的情况下应用安全实践。NetBird网络普遍适用于云、本地、边缘和容器......