当前位置: 首页 > 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…...

Qwen3-ASR语音识别实战:快速搭建并测试多语言识别效果

Qwen3-ASR语音识别实战&#xff1a;快速搭建并测试多语言识别效果 想亲手搭建一个能听懂30多种语言和22种中文方言的语音识别系统吗&#xff1f;今天我们就来实战部署Qwen3-ASR&#xff0c;从零开始搭建服务&#xff0c;并亲自测试它的多语言识别能力。整个过程就像搭积木一样…...

SenseVoice-small效果展示:同一音频启用/禁用ITN功能的输出差异对比图解

SenseVoice-small效果展示&#xff1a;同一音频启用/禁用ITN功能的输出差异对比图解 1. 引言&#xff1a;一个被忽略的细节&#xff0c;如何影响语音识别的最终结果&#xff1f; 想象一下&#xff0c;你正在整理一场重要的会议录音。语音识别工具准确地将“一百二十万”转成了…...

OpenClaw语音交互方案:GLM-4.7-Flash对接Whisper实现语音指令

OpenClaw语音交互方案&#xff1a;GLM-4.7-Flash对接Whisper实现语音指令 1. 为什么需要语音交互&#xff1f; 作为一个长期在命令行和代码编辑器之间切换的开发者&#xff0c;我始终觉得键盘输入存在天然的限制。去年为一个视障朋友调试智能家居时&#xff0c;更让我意识到图…...

coze-loop真实案例:优化前后代码对比,效果惊艳!

coze-loop真实案例&#xff1a;优化前后代码对比&#xff0c;效果惊艳&#xff01; 1. 从低效到优雅&#xff1a;一段Python代码的蜕变之旅 最近在开发一个数据处理脚本时&#xff0c;我遇到了性能瓶颈。原始代码虽然功能正确&#xff0c;但处理10万条数据需要近30分钟。抱着…...

Pixel Dimension Fissioner实战:结合RAG实现领域知识约束的维度裂变

Pixel Dimension Fissioner实战&#xff1a;结合RAG实现领域知识约束的维度裂变 1. 工具概览与核心价值 Pixel Dimension Fissioner&#xff08;像素语言维度裂变器&#xff09;是一款基于MT5-Zero-Shot-Augment核心引擎构建的创新型文本增强工具。与传统AI写作工具不同&…...

幻境·流金惊艳效果展示:15步i2L生成的1024×1024电影级光影作品集

幻境流金惊艳效果展示&#xff1a;15步i2L生成的10241024电影级光影作品集 1. 光影艺术的新境界 想象一下&#xff0c;只需15步就能生成一张10241024分辨率的高清图像&#xff0c;画面质感堪比电影级别——这就是「幻境流金」带来的视觉革命。这个基于Z-Image i2L技术的影像创…...

ollama-QwQ-32B模型蒸馏实践:轻量化OpenClaw部署方案

ollama-QwQ-32B模型蒸馏实践&#xff1a;轻量化OpenClaw部署方案 1. 为什么需要模型蒸馏 去年冬天&#xff0c;当我第一次尝试在树莓派上部署OpenClaw时&#xff0c;遇到了一个棘手的问题——QwQ-32B模型需要至少24GB内存才能运行&#xff0c;而我的设备只有8GB。这个经历让我…...

RexUniNLU模型性能优化指南:提升推理速度30%的实战技巧

RexUniNLU模型性能优化指南&#xff1a;提升推理速度30%的实战技巧 1. 引言 如果你正在使用RexUniNLU这个强大的自然语言理解模型&#xff0c;可能已经感受到了它在处理各种NLP任务时的出色表现。不过在实际部署中&#xff0c;你可能会发现一个问题&#xff1a;推理速度有时候…...

为什么你的Dify异步节点总在CI/CD环境失败?12个被忽略的环境变量、时序依赖与上下文泄漏陷阱

第一章&#xff1a;Dify自定义节点异步处理面试题总览在 Dify 的工作流&#xff08;Workflow&#xff09;中&#xff0c;自定义节点&#xff08;Custom Node&#xff09;是实现复杂业务逻辑的核心扩展机制。当涉及耗时操作&#xff08;如大模型多轮调用、外部 API 批量请求、文…...

【微信小程序】如何优雅地获取用户昵称与头像(兼容性优化指南)

1. 微信小程序获取用户信息的现状与挑战 最近在做一个社区类小程序时&#xff0c;我发现获取用户昵称和头像这个看似简单的功能&#xff0c;在实际开发中会遇到不少坑。特别是随着微信基础库版本的迭代&#xff0c;官方对用户隐私保护越来越严格&#xff0c;获取方式也发生了很…...