PLINQ并行查询效率的简单分析

2023-11-20

PLINQ并行查询效率的简单分析

假设执行一次查询需要花费的时间比较大,那我们可以采用PLINQ并行查询来进行提速

并行查询,就是利用多核计算机并行执行查询语句来进行提速,这很好理解,一个工人工作慢,那就多叫几个工人同时进行工作,这样工作的进展不就快了。火神山医院不也是靠这样方式建出来的吗,不然工人不多的话,10天怎么可能建造出一个火神山医院

显然,工作进展的快慢和工人数是有关的,在计算机中,工人数对应着线程数

运行以下代码,
这段代码是假设一个查询任务耗时约1s,分析:随着查询任务数量增多,使用普通LINQ执行完所有任务总耗时的变化情况,
简单的说,就是看
如果总任务数为1,需要执行多久,
总任务为2又需要执行多久……

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

namespace ConsoleApp1
{
  class Program
  {

    public static int ExpensiveFunction(int num)
    {
      Thread.Sleep(1000);
      return 1;
    }

    static void Main(string[] args)
    {
      for(int TaskNum = 1; TaskNum <= 20; TaskNum++)
      {
      	//记录开始时间
        DateTime dateTime1 = DateTime.Now;

        //创建List
        int maxLength = TaskNum;
        List<int> nums = new List<int>();
        for (int i = 0; i < maxLength; i++)
        {
          nums.Add(i);
        }

        //普通LINQ
        var result = from num in nums
                     select ExpensiveFunction(num);
        //并行PLINQ
        //var result = from num in nums.AsParallel()
        //             select ExpensiveFunction(num);

        //使用查询结果,否则LINQ实际不执行
        int sum = 0;
        foreach (int i in result)
        {
          sum += i;
        }
        Console.WriteLine($"任务数量:{TaskNum}");
		
		//记录结束时间
        DateTime dateTime2 = DateTime.Now;

        //输出所用时长
        Console.WriteLine("耗时:{0}", dateTime2 - dateTime1);
      }
    }
  }
}

运行结果:
在这里插入图片描述
可以发现,耗时几乎是随着任务数量的增加而线性增长的,这也好理解,同样是一个工人,任务越多,工作时间应该也是越多的,而且是一个线性的变化关系

在这里插入图片描述

然后再将以上代码的普通LINQ语句改为PLINQ语句,再次执行程序

运行结果:
在这里插入图片描述
可以发现,当任务数量小于等于16时,执行完所有任务的用时和任务数量为1个时的用时是差不多的
而当任务数量为17时,用时发生突变,变为之前的约两倍

这是因为我的电脑的8核16线程的,一次最多处理16个任务,当任务数增大到17时,17个任务不能同时并行执行,而是先并行执行16个任务,等有一个线程把当前任务做完了,它才会去做剩下的一个任务,因此花费时间相对于16个任务是两倍的关系

需要注意的是,PLINQ并不是在所有场景下都比LINQ的执行速度要快,因为PLINQ涉及大量的线程的创建和销毁操作,这也是需要耗时的,因此要强调当执行一次查询需要花费的时间比较大时,才推荐使用PLINQ来代替LINQ

再次进行测试,将之前代码进行一些修改,让每次的查询时间变小一点,我们只需要简单的把Thread.Sleep()注释掉即可
在这里插入图片描述
采用LINQ的执行结果:
在这里插入图片描述
采用PLINQ的执行结果
在这里插入图片描述
比较两者的执行时间,发现在一次查询任务所需代价较小时,PLINQ相对于LINQ并没有明显的优势,反而在很多情况下PLINQ的处理速度要慢于LINQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PLINQ并行查询效率的简单分析 的相关文章

  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 从 Orchard 内的主题渲染图像

    我刚刚选择 Orchard 来构建我的博客 作为创建这个新博客的努力的一部分 我正在创建一个自定义主题 这个自定义主题同时具有 CSS 和图像 我的问题 我的问题基本上可以归结为 如何渲染属于主题一部分的图像 到目前为止我已经尝试过的 我尝
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • .NET UI 元素线程限制的原因

    我们知道 除了实例化元素的线程之外 不可能从任何线程执行操作任何 UI 元素属性的代码 我的问题是 为什么 我记得当我们使用 COM 用户界面元素时 在 COM Visual Basic 6 0 时代 所有 UI 元素都是使用 COM 类和
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • QT遍历文件夹下的所有文件

    文章目录 方法一 代码 方法二 需要注意的地方 代码 技巧 代码 方法一 使用类QDirIterator来进行遍历 简介 大概是说 适合于大目录遍历 支持递归但是不支持排序 QDirIterator NoIteratorFlags默认值 没
  • SpringBoot整合ELK教程

    SpringBoot整合ELK教程 1 基础概念 ELK 即 Elasticsearch Logstash Kibana 组合起来可以搭建线上日志系统 本文主要讲解使用 ELK 来收集测试框架产生的日志 Elasticsearch 用于存储
  • Nim 游戏

    你和你的朋友 两个人一起玩 Nim 游戏 桌子上有一堆石头 你们轮流进行自己的回合 你作为先手 每一回合 轮到的人拿掉 1 3 块石头 拿掉最后一块石头的人就是获胜者 假设你们每一步都是最优解 请编写一个函数 来判断你是否可以在给定石头数量
  • Linux_centos7_文件与目录管理_目录操作(1)_(Bird_Bro)

    关键词 路径 相对 绝对 目录操作 特殊目录 目录处理 环境变量 文件与目录验视 ls https blog csdn net weixin 38872771 title directory operating command 切换至roo
  • 程序员教你如何用Python爬取付费小说

    小说相信大家都爱看吧一章接一章具有极大的吸引力 看了还想看 当然付费小说价格也不便宜 看到一半突然收费 猝不及防 在我们程序员这里 收费是不存在的 万物皆可爬 什么是网络爬虫 网络爬虫 又被称为网页蜘蛛 网络机器人 在FOAF社区中间 更经
  • 【Colab】【使用外部数据的7种方法】

    文章目录 方法1 通过Files explorer上传 方法2 使用Colab files上传 方法3 读取Github链接 方法4 克隆Github项目 方法5 使用wget axel下载文件 方法6 读取谷歌硬盘数据 方法7 Kaggl
  • 天干年月算法java

    上班空闲时间 看见朋友圈发了张毛笔画 上面写了丙申 好奇查了查 下面说说java实现 很简单 简单到爆 哈啊哈 String tianGanTZ 庚 辛 壬 癸 甲 乙 丙 丁 戊 己 申 酉 戌 亥 子 丑 寅 卯 辰 巳 午 未 int
  • Java+SSM+Vue 毕业设计 电影院在线售票管理系统系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 开发环境 3 3 系统流程 3 3 1 系统开发流程 3 3 2 用户登录流程 3 3 3 系统操作流程 3 4 系统结构设计 4 项目获取 1 项
  • JVM中的对象和引用详解

    1 对象的创建过程 其中的步骤是 当虚拟机碰到一条new指令时 先检查对象是否被加载 如果未被加载 就先将class加载到运行时数据区 然后虚拟机为对象分配内存 分配内存有两种方式 内存空间如果不是碎片化的 内存中已经使用的和未使用的内存空
  • 2023·基于Node.js的快递查询项目

    随着电商的发展 如今网上购物的人越来越多 频率越来越高 不用出门就能买到自己想要的东西 商品下了单之后商品怎么到自己的手上呢 这就离不开快递和物流了 商家把商品给到快递和物流服务商 快递和物流服务商则把商品运输并配送到我们的手上 除了电商行
  • Sublime Text 3 插件安装及Vim 模式设置

    Sublime Text 3 1 安装Sublime Text 3 下载安装 http www sublimetext com 3 Package Control安装 https sublime wbond net installation
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java数组细节

    注意细节 1 数组的元素可以是任意类型 包括基本类型和引用类型 但是不能混用 2 数组中的元素满足自动转型原则 比如double类型的数组中可以存储int整数 这是因为整数已经自动转成double 但是int类型的数组中不能存放string
  • 第二十四节:动态加载JS和动态加载CSS

    1 动态加载JS 一般需要用到js 需要将js放到
  • R基础(一)- R版本升级、现有版本查看

    R版本升级 系统 WINDOWS 方式 推荐打开RGui界面进行升级 而不要再RStudio中直接输入命令 包 installr 代码 安装包 如果已经有此包可跳过此步骤 install packages installr 加载包 升级 l
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • 0227:zotero文献管理/小绿鲸英文/CSDN做笔记

    搜索 下载 白嫖 翻译 文章 如何精准找到和方向相关的文献 谷歌学术 国内无法正常进入 两个镜像网站 https xueshu dailyheadlines cc https scholar lanfanshu cn 搜索技巧 关键词套双引
  • OS——文件管理系统磁盘的结构之搞清盘面和柱面

    如上图 每个柱面有三个盘面 即就是3个磁道 柱面可以抽象的理解成是一个套一个的立体的同心圆柱体 例 2019年408真题 磁盘有300个柱面 每个柱面有10个磁道 每个磁道有200个扇区 扇区大小为512B 则磁盘容量 分析 每个柱面有10
  • 【排错】error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14:的解决方式

    在部署k8s的时候 编写k8s的dashboard文件 遇到以下错误 error error parsing recommended yaml error converting YAML to JSON yaml line 14 could
  • PLINQ并行查询效率的简单分析

    PLINQ并行查询效率的简单分析 假设执行一次查询需要花费的时间比较大 那我们可以采用PLINQ并行查询来进行提速 并行查询 就是利用多核计算机并行执行查询语句来进行提速 这很好理解 一个工人工作慢 那就多叫几个工人同时进行工作 这样工作的