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

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

时间:2023-12-06 22:23:18浏览次数:37  
标签:C# 并行 LINQ AsParallel 并行处理 ForEach 查询 Parallel

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

 

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,并行处理,ForEach,查询,Parallel
From: https://www.cnblogs.com/sexintercourse/p/17880672.html

相关文章

  • Java反序列化 CC7链
    参考链接https://blog.csdn.net/qq_35733751/article/details/119862728https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections7.javahttps://y0n3er.github.io/undefined/45911.html环境搭建CommonsCollections3.2.1JD......
  • 如何从Webpack迁移到Vite
    本文将介绍如何将前端web应用程序从Webpack升级到Vite。Vite是最新的前端开发工具,其受欢迎程度和采用率都在大幅增长。可以查看下图中来自npmtrends的下载。推动这一趋势的是Vite核心的一个关键概念:开发人员体验。与Webpack相比,Vite在开发过程中能显著缩短构建时......
  • Java反序列化 CC4链
    参考链接https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections4.javahttps://www.bilibili.com/video/BV1NQ4y1q7EU环境搭建CommonCollections4jdk8u65利用链分析看了下ysoserial的exp,其实就是CC3的代码执行+Common.Co......
  • Java反序列化 CC2链
    参考链接https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections2.java环境搭建CommonCollections4jdk8u65利用链分析这条链子是利用invokerTransformer触发templates.newTransformer(),进而触发TemplatesImpl代码执行Gadg......
  • Java反序列化 CC5链
    参考链接https://github.com/frohoff/ysoserial/blob/master/src/main/java/ysoserial/payloads/CommonsCollections5.java环境搭建Commons.Collections3.2.1jdk8u65利用链分析后面都和CC1-LazyMap一样,前面的话,改了下调用lazyMap.get的函数和入口类,没啥好分析的/* Gadget......
  • 【CCFCSP】2212真题笔记
    -1.现值计算分析做第一题避免用vector,会把简单问题复杂化普通数组或者哈希映射就足够解决问题了微微微模拟,题目有公式ans(-14.059)=(-200)x(1.05^0)+100x(1.05^-1)+100x(1.05^-2)测试数据:20.05-200100100AC:#include<bits/stdc++.h>usingnamespacestd......
  • python连接mysql、oracle数据库
    python版本:3.10.5mysql版本:8.0.27oracle版本:oracle12c一、python连接mysql数据库安装第三方依赖PyMySQL,终端执行如下命令:pipinstallPyMySQLPyMySQL使用importpymysqlconfig={'host':'127.0.0.1','port':3306,'u......
  • 微服务(Microservices)
    微服务(Microservices)出处本文是于2014年由JamesLewis和MartinFowler共同编写的文章-微服务(Microservices)的译文原文网址:https://martinfowler.com/articles/microservices.html前言"微服务架构"这个术语在过去几年中频繁被提到,用来描述一种将软件应用程序设计为可独立......
  • 【Python】【OpenCV】凸轮廓和Douglas-Peucker算法
    针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作。 cv2.arcLength()Method:参数:curve:要计算周长的轮廓,可以是一个矩形、圆形、多边形等封闭曲线。closed:一个布尔......
  • CTFpwn全保护简单介绍及一道保护全开题
    今日份心脏骤停,噔噔咚!每种保护介绍FullRELRO保护原理:其实就是不让你改写got表中的内容。影响:不能劫持stack_chk_fail函数以绕过canary,不能劫持动态链接里面已经调用过的函数。(不懂libc快去翻我文章doge)Canary保护原理:在所有函数的栈的末尾(比如rbp-8)插入一个值,叫做canary,在......