C#多线程下的调优

C#性能调优实战:Stopwatch与高精度计时器的隐藏技巧 本文深入探讨了C#中Stopwatch类在高精度性能调优中的应用技巧,包括其底层机制、高级用法和实战案例。通过Stopwatch与高精度计时器的结合,开发者可以精确测量代码执行耗时,优化游戏开发、高频交易等时间敏感场景的性能表现。 阅读详情

Python微信订餐小程序课程视频

https://edu.youkuaiyun.com/course/detail/36074

Python实战量化交易理财系统

https://edu.youkuaiyun.com/course/detail/35475目录


回到顶部# 一、原子操作

先看一段问题代码

 /// 
        /// 获取自增
 /// 
        public static void GetIncrement()
 {
 long result = 0;
 Console.WriteLine("开始计算");
 //10个并发执行
            Parallel.For(0, 10, (i) =>
 {
 for (int j = 0; j < 10000; j++)
 {
 result++;
 }
 });
 Console.WriteLine("结束计算");
 Console.WriteLine($"result正确值应为:{10000 * 10}");
 Console.WriteLine($"result 现值为:{result}");
 Console.ReadLine();
 }

这是多线程下,result的值不同步的原因。

1.基于Lock实现

平时大家用的最多的应该就是加锁了,同一时间,只有一个线程进入代码块。

实现代码:

 private static Object \_obj = new object();
     /// 
        /// 原子操作基于Lock实现
 /// 
        public static void AtomicityForLock()
 {
 long result = 0;
 Console.WriteLine("开始计算");
 //10个并发执行
           Parallel.For(0, 10, (i) =>
 {
 //lock锁
                lock (\_obj)
 {
 for (int j = 0; j < 10000; j++)
 {
 result++;
 }
 }
 });
 Console.WriteLine("结束计算");
 Console.WriteLine($"result正确值应为:{10000 * 10}");
 Console.WriteLine($"result 现值为:{result}");
 Console.ReadLine();

 }

结果:

2.基于CAS实现

CAS是一种有名的无锁算法。无锁编程,即不适用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步。  CAS在.NET中的实现类是Interlocked,内部提供很多原子操作的方法,最终都是调用Interlocked.CompareExchange(ref out,更新值,期望值) //基于内存屏障的方式操作 (七个步骤)说到线程安全,不要一下子就想到加锁,尤其是可能会调用频繁或者是要求高性能的场合。

  • CAS(Compare And Swap)比较并替换,是线程并发运行时用到的一种技术
  • CAS是原子操作,保证并发安全,而不能保证并发同步
  • CAS是CPU的一个指令(需要JNI调用Native方法,才能调用CPU的指令)
  • CAS是非阻塞的、轻量级的乐观锁

CAS的适用场景

读多写少:如果有大量的写操作,CPU开销可能会过大,因为冲突失败后会不断重试(自旋),这个过程中会消耗CPU  单个变量原子操作:CAS机制所保证的只是一个变量的原子操作,而不能保证整个代码块的原子性,比如需要保证三个变量共同进行原子性的更新,就不得不使用悲观锁了

Interlocked主要函数如下:Interlocked.Increment    原子操作,递增指定变量的值并存储结果。Interlocked.Decrement   原子操作,递减指定变量的值并存储结果。Interlocked.Add        原子操作,添加两个整数并用两者的和替换第一个整数Interlocked.Exchange  原子操作,赋值Interlocked.CompareExchange(ref a, b, c); 原子操作,a参数和c参数比较, 相等b替换a,不相等不替换。方法返回值始终是第一个参数的原值,也就是内存里的值

用Interlocked.Increment实现上面自增功能

代码:

     /// 
        /// 自增CAS实现
 /// 
        public static void AtomicityForInterLock()
 {
 long result = 0;
 Console.WriteLine("开始计算");
 Parallel.For(0, 10, (i) =>
 {
 for (int j = 0; j < 10000; j++)
 {
 //自增
                    Interlocked.Increment(ref result);
 }
 });
 Console.WriteLine($"结束计算");
 Console.WriteLine($"result正确值应为:{10000 * 10}");
 Console.WriteLine($"result 现值为:{result}");
 Console.ReadLine();
 }

结果:

Interlocked下原子操作的方法最终都是调用Interlocked.CompareExchange(ref a, b, c)实现的,现在我们利用CompareExchange自己实现一个原子操作功能

实现“一个变量自增到10000,然后又初始化到1开始自增的功能“

代码:

    /// 
        /// 基于CAS原子操作自己写
 /// 
        public static void AtomicityForMyCalc()
 {
 long result = 0;
 Console.WriteLine("开始计算");
 
 Parallel.For(0, 10, (i) =>
 {
 long init = 0;
 long incrementNum = 0;
 for (int j = 0; j < 10000; j++)
 {
 do
 {
 init = result;
 incrementNum = result + 1;
 incrementNum= incrementNum > 10000 ? 1 : incrementNum; //自增到10000后初始化成1

 }
 //如果result=init,则result的值被incrementNum替换,否则result不变,返回的是result的原始值
                    while (init != Interlocked.CompareExchange(ref result, incrementNum, init));
 if(incrementNum==10000)
 {
 Console.WriteLine($"自增到达10000啦!值被初始化为1");
 }
 }
 });
 Console.WriteLine($"结束计算");

 Console.WriteLine($"result正确值应为:{10000}");
 Console.WriteLine($"result 现值为:{result}");
 Console.ReadLine();

 }

结果:

3.自旋锁SpinLock

自旋锁(

Sdcb.PaddleOCR vs PaddleOCRSharp:C# OCR选型实战对比与性能调优心得 本文深入对比了C#生态中两个热门OCR库Sdcb.PaddleOCR和PaddleOCRSharp的性能差异,从识别准确率、处理速度、内存占用和API设计等多个维度进行分析。通过实际测试数据展示了各自优势,并提供了针对Sdcb.PaddleOCR的性能调优技巧,帮助开发者在不同场景下做出最优选择。 阅读详情

相关推荐

避坑指南:C#上位机开发中的多线程陷阱与性能调优

本文深入探讨C#上位机开发中的多线程陷阱与性能优化策略。首先分析了常见多线程问题,包括竞态条件、死锁、线程切换损耗、线程池误用及异步同步混用等,并提供了具体解决方案。在性能优化方面,重点介绍了内存管理优化(对象池)、减少锁竞争(无锁编程)、并行处理技术及Profiler工具的使用。通过合理运用这些技术,开发者可以避免多线程常见问题,显著提升上位机系统的性能和稳定性。文章为C#上位机开发人员提供了实用的多线程编程指南和性能调优方法。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1396

C#上位机+YOLO实时目标检测:摄像头采集+多线程推理+精度调优全流程

标注数据集:使用LabelImg工具标注目标对象,按YOLO格式整理数据集;模型训练:使用Ultralytics库训练自定义模型,提升特定目标的检测精度;训练参数优化:增加训练轮数(epochs=100200)、调整批次大小(batch=1632)、使用数据增强(flip、mosaic等)。摄像头采集:封装通用采集类,支持USB摄像头/网口相机,实现稳定帧读取与异常处理;多线程推理:采用“采集线程+推理线程+UI线程”解耦架构,使用线程安全队列传递帧数据,彻底解决界面卡顿;核心封装。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 673

C#内存核爆级调优:用垃圾回收的“量子跃迁”让性能暴涨1000%!

《C#内存核爆级调优实战》摘要: 本文提出一套量子级C#内存优化方案:1)通过分代GC阈值精确控制(Gen0 1MB/Gen1 16MB/Gen2 256MB),结合低延迟模式与并发GC;2)量子对象池技术减少GC压力,实现对象复用;3)大对象堆(LOH)采用预分配+二次压缩策略避免碎片化;4)终结器管理采用显式Dispose模式,配合GC.SuppressFinalize;5)多线程场景应用内存预取(SIMD指令)和线程局部存储([ThreadStatic])。关键技术包括:分代GC精确触发、LOH量子压

墨夶的博客 231

工业自动化中的C#多线程编程与实时数据处理

摘要: 工业自动化系统依赖高实时性、可靠性与并发处理能力。C#凭借多线程支持与丰富生态,逐渐应用于PLC数据采集、HMI系统等场景。本文探讨了C#多线程模型(Thread/Task/Channel等)的选型策略,提出分层线程架构(采集/分析/持久化线程分离),并通过Channel实现线程间高效通信。实战案例展示了10线程并发采集100台PLC、实时阈值检测与异步推送的完整设计,强调批处理、异步I/O和动态负载均衡等优化手段。尽管C#属于软实时系统,但通过优先级调度、延迟监控和分层缓存,可满足工业场景的准实时

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1398

【深度避坑】Word 提示“内存或磁盘空间不足,保存失败”的真正原因与终极解决方案

这是 Word 2003 时代的老功能⚠现代 Office 使用全新的保存 API(与 OneDrive 深度集成)老插件无法兼容现代保存机制会拦截 Word 的写入流程导致保存动作失败,Word 误以为磁盘坏了,于是报错不是磁盘坏了,是 Word 被插件绊倒了。Word 无法保存 = 加载项冲突(尤其是书法 / 稿纸向导)。永久禁用即可彻底恢复。如果在写毕业论文、要交文档,强烈建议马上检查一下你的加载项,避免后期出现大规模崩溃丢稿。

m0_59029415的博客 3067

快速配置ORCAD导出智能PDF原理图

在OrCAD 中导出类似Altium Designer的智能PDF(即交互式PDF);

QingNing3028的博客 3946

Arm A-profile架构RAS系统设计:可靠性、可用性与可服务性解析

在计算机体系结构中,可靠性(Reliability)、可用性(Availability)和可服务性(Serviceability)是构建高可信系统的核心要素。RAS系统通过硬件错误检测、隔离和恢复机制,确保系统持续稳定运行。其技术原理包括ECC内存纠错、冗余执行单元和错误传播阻断等关键技术,可显著降低数据中心等关键业务场景的故障率。现代芯片设计中,Arm A-profile架构提供标准化的RAS框架,涵盖从内存子系统到计算单元的全方位错误管理。通过分层防御策略和统一错误记录格式,实现硬件错误可追溯、可修复。

weixin_30920853的博客 357

C语言|深入浅出讲解int转换为float全过程(附2017年统考大题案例)

int转换为float类型为什么会发生精度损失? 精度损失的详细过程究竟是什么样的? 什么样情况float会发生精度损失?没有弄懂2017年浮点数统考大题? 这一篇用2017年统考大题案例帮你更深的理解浮点数的存储规则。

DADONGOOO的博客 1万+

论文阅读 Quantum Convolutional neural network

在传统的局域序参量(如磁化强度 ⟨Xi⟩)无法有效区分某些拓扑相(如 Haldane 相)时,字符串序参量(SOP)提供了一种方法来识别这些相。字符串序参量的定义通常涉及多个远离的站点之间的长程关联,通常具有如下形式:Zi,Xk,Zj是泡利矩阵(Pauli operators)。指数项 eiπ∑k=ijXk表示一个相位因子。这意味着我们要计算两个远离站点 i,j 的Z 分量的关联,同时考虑它们之间的X 作用。这个非局域的字符串序参量可以用来检测对称保护拓扑(SPT)相。

m0_54373077的博客 2000

YOLOv8改进:卷积篇 | 保姆级探索动态蛇形卷积 (Dynamic Snake Convolution) 的实现与应用

动态蛇形卷积是一种新的卷积操作,它能够更好地捕捉图像中的细节信息。传统卷积核的形状和大小是固定的,而动态蛇形卷积则允许卷积核在不同的位置动态调整其形状,以更好地适应输入数据的特点。这种灵活性使得动态蛇形卷积在处理复杂背景和细节丰富的图像时具有显著优势。我们先定义一个基本的动态蛇形卷积模块。这个模块将作为YOLOv8卷积层的替代。为了全面集成动态蛇形卷积,我们需要修改YOLOv8的模型定义,将所有的基础卷积层替换为我们的SnakeConv模块。

一键难忘的博客 5483

【人工智能之深度学习】21. 自动驾驶感知实战:YOLOv4复杂天气优化方案(BDD100K全代码+效果对比)

摘要:自动驾驶摄像头在雨雾天气下易受图像模糊、目标遮挡影响,导致YOLOv4检测精度骤降。本文基于BDD100K公开数据集(含多天气场景),设计三阶段优化方案:1)物理建模生成雨雾效果(雨滴线条+大气散射模型),将恶劣天气样本占比从20%提升至40%;2)在YOLOv4颈部嵌入CBAM注意力机制,强化模糊区域特征提取;3)L1剪枝(30%)+TensorRT量化实现轻量化。需特别说明:本文为教学虚拟案例,不可直接用于车载部署,实际落地需结合多传感器融合与ISO 26262认证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1684

Unity中的Timeline

Timeline与动画系统类似,但是它可以针对多个物体做出一系列多个动画,它可以创建多个轨道,对象激活与隐藏轨道,动画轨道,声音轨道等。每个轨道都可以单独编辑,轨道内的不同资源可以排列并且融合

L的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: 反射的概念 和基本使用(一)
下一篇: 数据结构笔记——树与二叉树
pythonxxoo
博客等级 码龄5年 337粉丝 670原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值