首页 > 编程语言 >C#中的并行处理、并行查询的方法你用对了吗?

C#中的并行处理、并行查询的方法你用对了吗?

时间:2023-12-05 10:02:33浏览次数:31  
标签:C# 并行 LINQ AsParallel 并行处理 num ForEach 查询 Parallel

Parallel.ForEach

Parallel.ForEach 是一个用于在集合上并行执行迭代操作的强大工具。它通过有效地利用多核处理器的能力来提高性能。Parallel.ForEach 不仅能够简化并行编程,而且它在执行简单循环时可以提供比传统迭代更好的性能。

下面是一个简单的示例,演示了如何使用 Parallel.ForEach 并行处理一个整数列表:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        List<int> numbers = GetNumbers();

        // 使用 Parallel.ForEach 并行处理整数列表
        Parallel.ForEach(numbers, num =>
        {
            int result = ProcessNumber(num);
            Console.WriteLine($"Processed {num} - Result: {result}");
        });

        Console.ReadLine();
    }

    static List<int> GetNumbers()
    {
        // 获取一个包含大量整数的列表
        List<int> numbers = new List<int>();
        for (int i = 1; i <= 10000; i++)
        {
            numbers.Add(i);
        }
        return numbers;
    }

    static int ProcessNumber(int number)
    {
        // 模拟一些计算密集型的操作
        return number * number;
    }
}

在上面的例子中,Parallel.ForEach 会并行地处理 numbers 列表中的每个元素,并调用 ProcessNumber 方法。由于这个示例中的计算是相对简单的,因此并行化可能在性能上并不明显。实际上,Parallel.ForEach 对于处理更大规模的数据集或更复杂的计算任务时效果更为显著。

AsParallel

AsParallel 是 LINQ 中的方法,它能够将查询操作并行化。使用 AsParallel 可以使 LINQ 查询在多个处理器上并行执行,提高查询性能。它返回一个 ParallelQuery<T> 对象,支持并行执行 LINQ 操作。

下面是一个示例,展示了如何使用 AsParallel 在整数列表上执行并行 LINQ 查询:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = GetNumbers();

        // 使用 AsParallel 在整数列表上执行并行 LINQ 查询
        var result = numbers
            .AsParallel()
            .Where(num => num % 2 == 0)  // 过滤偶数
            .Select(num => num * num)     // 对偶数取平方
            .ToList();

        // 输出结果
        Console.WriteLine("Parallel LINQ Result:");
        foreach (var num in result)
        {
            Console.WriteLine(num);
        }

        Console.ReadLine();
    }

    static List<int> GetNumbers()
    {
        // 获取一个包含大量整数的列表
        List<int> numbers = new List<int>();
        for (int i = 1; i <= 10000; i++)
        {
            numbers.Add(i);
        }
        return numbers;
    }
}

在上面的例子中,AsParallel 被用于将 LINQ 查询并行化。查询首先过滤出列表中的偶数,然后计算每个偶数的平方。最终结果是一个包含平方值的列表。这里的示例相对简单,但在处理更大规模或更复杂的数据时,AsParallel 可以显著提高性能。

区别与性能比较

区别:

  1. 用途不同:
  2. Parallel.ForEach 用于并行处理集合的元素,可以直接应用于循环迭代。
  3. AsParallel 用于将 LINQ 查询并行化,主要用于在 LINQ 查询中实现并行处理。
  4. 操作对象不同:
  5. Parallel.ForEach 操作集合的元素,需要提供一个委托来定义每个元素上的操作。
  6. AsParallel 操作 LINQ 查询,使得查询中的操作能够在并行上执行。

性能比较:

性能的相对优劣取决于具体的使用场景和数据集。通常来说:

  • Parallel.ForEach 在直接的集合迭代操作中可能更为高效,特别是对于简单的计算密集型任务。
  • AsParallel 更适合于在 LINQ 查询中进行并行处理,特别是对于需要进行筛选、映射和其他复杂操作的情况。

在实际应用中,建议根据任务的性质选择合适的工具。如果你有一个简单的集合迭代任务,Parallel.ForEach 可能更合适。如果你在进行复杂的查询操作,AsParallel 可能更适用。

在并行编程中,选择使用 Parallel.ForEach 还是 AsParallel 取决于任务的性质。在处理集合元素时,Parallel.ForEach 提供了直观且简单的方式;而在进行复杂的 LINQ 查询时,AsParallel 提供了更灵活的并行处理能力。在实际应用中,通过仔细分析任务需求和性能特征,可以更好地选择适当的工具来实现并行化。

 

标签:C#,并行,LINQ,AsParallel,并行处理,num,ForEach,查询,Parallel
From: https://www.cnblogs.com/hanbing81868164/p/17876423.html

相关文章

  • Docker CLI docker restart 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中......
  • Unity DOTS系列之托管/非托管Component的区别与性能分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面托管与非托管Component的区别与性能分析,方便大家上手学习掌握UnityDOTS开发。托管与非托管的区别在于是不是基于自动垃圾回收的。托管是由垃圾回收器来负责自动回收,非托管需要我们手动来做相关内存管理,不被垃圾回收系统来处理。......
  • JS 中 package 包版本格式
    在JavaScript中,通过npm(或yarn)管理的package.json文件中,你可以为依赖指定多种格式的版本号。版本号通常遵循语义化版本控制(SemVer),格式为主版本号.次版本号.修订号(MAJOR.MINOR.PATCH)。以下是一些常见的版本号格式:精确版本(Exact):"1.2.3"这指定了一个精确的版本号。脱字符(Caret):......
  • C# 小数 ToString()
     floatnum=1.123F;stringresult=num.ToString("0.##");//1.12Console.WriteLine(result);result=num.ToString(".##");//1.12Console.WriteLine(result); num=......
  • EMC AX4-5 array's 重启web服务
    IftheEMCAX4-5array'swebinterfaceisn'taccessibleandyouneedtorestarttheserviceusingNavisphereCLI,youcanattemptthefollowingsteps:ConnecttothearrayviaNavisphereCLI:Useaterminalorcommandprompttoconnecttothear......
  • IDEA MyBatisCodeHelper Pro插件
    #IDEAMyBatisCodeHelperPro插件原文地址:http://ytxy.xyz/pages/mchp_new/#前言3.2.4以后更新了策略。(截图新老混用,懒得截了,意思能明白就行)文章的图片使用的是GitHub做的图床,如果图片加载不出来,挂梯即可。#版本说明系统:macOS(Windows同理)IDE:IntelliJIDEA2023.2.5MyB......
  • CAN-bus应用笔记:节点篇
    在CAN-bus电路设计中,理论上收发器支持节点数最多可做到110个,但实际应用中往往达不到这个数量。今天我们就来谈谈如何通过合理的CAN-bus总线设计,保证CAN网络中的通讯的可靠性和节点数量。影响CAN总线节点数的因素影响总线节点数的因素有多种,本文我们从满足接收节点的差分电压幅值......
  • Docker CLI docker rename 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中......
  • c++回调函数
    最近用到了回调函数,距离上次使用至少隔了5年了,又重新熟悉了一下。  转自:https://blog.csdn.net/hua12134/article/details/88264250什么是函数指针函数指针就是指向函数的指针,指向某种特定的类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如:boollength......
  • Docker部署lsky-pro
    一、简介LskyPro是一个用于在线上传、管理图片的图床程序,中文名:兰空图床,你可以将它作为自己的云上相册,亦可以当作你的写作贴图库。二、搭建lsky-pro绿联DX4600为例,首先我们打开Docker管理器,进入镜像管理,然后在镜像仓库中搜索halcyonazure/lsky-pro-docker​,选择latest......