当前位置: 首页 > news >正文

[.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试

场景

有个Service类,自己在内部实现生产者/消费者模式。即多个指令输入该服务后对象后,Service内部有专门的消费线程执行传入的指令。每个指令的执行间隔为1秒。这里有两部分组成,

  1. 工作线程的载体。new ThreadTask.Run
  2. 执行等待的方法。Thread.SleepTask.Delay

测试环境

cpu: AMD 3700x 8核16线程
RAM:128G 3200MHz

示例代码

public class Service
{public Service(int id, Action f, int delayMillisecond = 1000){Id = id;F = f;DelayMillisecond = delayMillisecond;}private int DelayMillisecond;private BlockingCollection<Action> _collection = new BlockingCollection<Action>();public int Id { get; }public Action F { get; }public void AddAction(){_collection.Add(F);}public void Run1(){new Thread(Worker_Sleep).Start();}public void Run2(){new Thread(Worker_Delay).Start();}public void Run3(){Task.Run(Worker_Sleep);}public void Run4(){Task.Run(Worker_Delay);}private void Worker_Sleep(){{foreach (var action in _collection.GetConsumingEnumerable()){action?.Invoke();Thread.Sleep(DelayMillisecond);}}}private async void Worker_Delay(){{foreach (var action in _collection.GetConsumingEnumerable()){action?.Invoke();await Task.Delay(DelayMillisecond);}}}
}

使用BlockingCollection存储指令并通过GetConsumingEnumerable消费。

  • run1。Thread+Thread.Sleep
  • run2。Thread+Task.Delay
  • run3。Task.Run+Thread.Sleep
  • run4。Task.Run+Task.Delay
var serviceCount = 200; // 服务数量
var actionCount = 3; // 指令个数
var actionInterval = 1000; // 指令执行时间间隔ms
var services = new List<Service>();Action f = () =>
{Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss ffff")}\t{Thread.CurrentThread.ManagedThreadId}\tCount:{Count}");
};// 生成所有服务对象
for (int i = 0; i < serviceCount; i++)
{var s = new Service(i, f, actionInterval);services.Add(s);
}Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss ffff")}\tRun");
services.ForEach(s => s.Run2());while (true)
{// 输入任意内容,启动var msg = Console.ReadLine();Console.WriteLine($"{DateTime.Now.ToString("HH:mm:ss ffff")}\tStart!!!!!!!!!!");// 每个服务对象自行输入指令services.ForEach(s =>{for (int i = 0; i < actionCount; i++){s.AddAction();}});
}

测试参数组为
serviceCount,50,100,200,500,1000。(其他使用默认)

类型对象个数指令个数间隔完成耗时
run150312.3s
run1100312.1s
run1200312.2s
run1500312.4s
run11000312.9s
run250312.3s
run2100312.5s
run2200313.1s
run2500315.2s
run210003110.5s
run3503127s
run31003178s
run320031-
run350031-
run3100031-
run450312.2s
run4100312.1s
run4200312.2s
run4500312.4s
run41000312.7s

3个指令,1秒间隔,理想状态下,完成耗时应是2秒。且随着对象个数增多,仍然能保持在一个合理范围。
由以上数据可知,run1run4是在时间消耗上比较符合期望。

  • run1。Thread+Thread.Sleep
  • run4。Task.Run+Task.Delay

我们更改参数,比较两者的cpu占用情况。测试参数如下:
服务数量:serviceCount=2000
指令个数:actionCount=50
指令执行时间间隔/ms:actionInterval = 1000
cpu占用情况如图。
在这里插入图片描述

服务数量:serviceCount=200
指令个数:actionCount=50
指令执行时间间隔/ms:actionInterval = 1000
cpu占用情况如图。
在这里插入图片描述
基于这两张图,可以得到初步结论:

  1. Task.Run+Task.Delay在初始化阶段需要占用较大的cpu资源。后续较为平稳,对数量的增加并不敏感(200到2000)
  2. Thread+Thread.Sleep在初始化期间与正常运行两个周期,前后一致性较强。但是对数量的增加敏感(200到2000)

相关文章:

[.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试

场景 有个Service类&#xff0c;自己在内部实现生产者/消费者模式。即多个指令输入该服务后对象后&#xff0c;Service内部有专门的消费线程执行传入的指令。每个指令的执行间隔为1秒。这里有两部分组成&#xff0c; 工作线程的载体。new Thread与Task.Run。执行等待的方法。…...

【单线图的系统级微电网仿真】基于 PQ 的可再生能源和柴油发电机组微电网仿真(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

人脸识别技术应用安全管理规定(试行)|企业采用人脸打卡方式,这4条规定值得关注

近日&#xff0c;为规范人脸识别技术应用&#xff0c;国家互联网信息办公室起草了&#xff0c;并向全社会公开征求意见。该规定一共列举了25条&#xff0c;企业如借助人脸识别技术采集考勤打卡数据&#xff0c;以下4条规定值得关注。 第四条 只有在具有特定的目的和充分的必要…...

leetcode 817. 链表组件(java)

链表组件 题目描述HashSet 模拟 题目描述 给定链表头结点 head&#xff0c;该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums&#xff0c;该列表是上述链表中整型值的一个子集。 返回列表 nums 中组件的个数&#xff0c;这里对组件的定义为&#xff1a;链表中一段…...

分布式事务基础理论

基础概念 什么是事务 什么是事务&#xff1f;举个生活中的例子&#xff1a;你去小卖铺买东西&#xff0c;“一手交钱&#xff0c;一手交货”就是一个事务的例子&#xff0c;交钱和交货必 须全部成功&#xff0c;事务才算成功&#xff0c;任一个活动失败&#xff0c;事务将撤销…...

《打造高可用PostgreSQL:策略与工具》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…...

【八大经典排序算法】快速排序

【八大经典排序算法】快速排序 一、概述二、思路实现2.1 hoare版本2.2 挖坑法2.3 前后指针版本 三、优化3.1 三数取中3.1.1 最终代码3.1.2 快速排序的特性总结 四、非递归实现快排 一、概述 说到快速排序就不得不提到它的创始人 hoare了。在20世纪50年代&#xff0c;计算机科学…...

vue 父组件给子组件传递一个函数,子组件调用父组件中的方法

vue 中父子组件通信&#xff0c;props的数据类型可以是 props: {title: String,likes: Number,isPublished: Boolean,commentIds: Array,author: Object,callback: Function,contactsPromise: Promise // or any other constructor }在父组件中&#xff0c;我们在子组件中给他…...

docker 获取Nvidia 镜像 | cuda |cudnn

本文分享如何使用docker获取Nvidia 镜像&#xff0c;包括cuda10、cuda11等不同版本&#xff0c;cudnn7、cudnn8等&#xff0c;快速搭建深度学习环境。 1、来到docker hub官网&#xff0c;查看有那些Nvidia 镜像 https://hub.docker.com/r/nvidia/cuda/tags?page2&name11.…...

uTool快捷指令

send("************"); quickcommand.sleep(200); keyTap("enter");...

R reason ‘拒绝访问‘的解决方案

Win11系统 安装rms的时候报错&#xff1a; Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck vI[[j]]) : namespace Matrix 1.5-4.1 is already loaded, but > 1.6.0 is required## 安装rms的时候报错&#xff0c;显示Matrix的版本太低…...

许战海战略文库|品类缩量时代:制造型企业如何跨品类打造份额产品?

所有商业战略的本质是围绕着竞争优势与竞争效率展开的。早期&#xff0c;所有品牌立足于从局部竞争优势出发。因此,品牌创建初期大多立足于单个品类。后期增长受限,就要跨品类持续扩大竞争优势&#xff0c;将局部竞争优势转化为长期竞争优势&#xff0c;如果固化不前很难获得增…...

BIT-4-数组

一维数组的创建和初始化一维数组的使用 一维数组在内存中的存储 二维数组的创建和初始化二维数组的使用二维数组在内存中的存储 数组越界数组作为函数参数数组的应用实例1&#xff1a;三子棋 数组的应用实例2&#xff1a;扫雷游戏 1. 一维数组的创建和初始化 1.1 数组的创建 …...

L9945的H桥续流模式

在H桥的配置中&#xff0c;包括两种续流模式&#xff1a;主动续流和被动续流。 一个L9945可输出两个H桥驱动。HB1在CMD3中配置&#xff0c;HB2在CMD7中配置。 主动续流&#xff1a;通过Q3的MOS的二极管来续流 被动续流&#xff1a;通过Q3外部的二极管来续流...

Ubuntu20.04安装Nvidia显卡驱动、CUDA11.3、CUDNN、TensorRT、Anaconda、ROS/ROS2

1.更换国内源 打开终端&#xff0c;输入指令&#xff1a; wget http://fishros.com/install -O fishros && . fishros 选择【5】更换系统源&#xff0c;后面还有一个要输入的选项&#xff0c;选择【0】退出&#xff0c;就会自动换源。 2.安装NVIDIA驱动 这一步最痛心…...

linux下使用crontab定时器,并且设置定时不执行的情况,附:项目启动遇到的一些问题和命令

打开终端&#xff0c;以root用户身份登录。 运行以下命令打开cron任务编辑器&#xff1a; crontab -e 如果首次编辑cron任务&#xff0c;会提示选择编辑器。选择你熟悉的编辑器&#xff0c;比如nano或vi&#xff0c;并打开相应的配置文件。 在编辑器中&#xff0c;添加一行类…...

linux下二进制安装docker最新版docker-24.0.6

一.基础环境 本次实操是公司技术培训下基于centos7.9操作系统安装docker最新版docker-24.0.6&#xff0c;下载地址是&#xff1a;https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz 二. 下载Docker压缩包 mkdir -p /opt/docker-soft cd /opt/docker…...

计算机视觉 01(介绍)

一、深度学习 1.1 人工智能 1.2 人工智能&#xff0c;机器学习和深度学习的关系 机器学习是实现人工智能的一种途径&#xff0c;深度学习是机器学习的一个子集&#xff0c;也就是说深度学习是实现机器学习的一种方法。与机器学习算法的主要区别如下图所示[参考&#xff1a;黑…...

Java下部笔记

目录 一.双列集合 1.Map 2.Map的遍历方式 3.可变参数 4.Collection中的默认方法 5.不可变集合&#xff08;map不会&#xff09; 二.Stream流 1.获取stream流 2.中间方法 3.stream流的收集操作 4.方法引用 1.引用静态方法 2.引用成员方法 3.引用构造方法 4.使用类…...

链表基本操作

单链表简介 单链表结构 头指针是指向链表中第一个结点的指针 首元结点是指链表中存储第一个数据元素a1的结点 头结点是在链表的首元结点之前附设的一个结点&#xff1b;数据域内只放空表标志和表长等信息 单链表存储结构定义&#xff1a; typedef struct Lnode { ElemTyp…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...