c# 高并发下的结构体struct和类class的性能差异
发布时间 - 2026-01-13 00:00:00 点击率:次struct在高并发下更快因其值类型特性,分配于栈或内联,免GC;class为引用类型,堆分配加剧GC压力与锁竞争。但过大struct或频繁值传递、逃逸至堆时反而更慢。
struct 在高并发下为什么比 class 更快
因为 struct 是值类型,分配在栈上(或内联在容器中),不经过 GC;而 class 是引用类型,每次 new 都触发堆分配,高并发时会快速产生大量短生命周期对象,加剧 GC 压力——尤其是 Gen0 频繁回收,直接拖慢吞吐量。
- 多个线程同时
new MyClass()→ 多个堆内存请求 → 竞争 GC heap lock(.NET 6+ 改进但仍有开销) - 同一线程内循环创建
MyStruct→ 栈指针偏移即可,无同步、无跟踪、无 finalizer 开销 - 结构体被用作字典键、队列元素、Span
内容时,避免装箱和指针间接访问
什么时候 struct 反而更慢
当结构体过大(通常 >16 字节)或频繁按值传递时,复制成本会反超引用传递。高并发场景下尤其明显:比如一个 64 字节的 struct 被当作方法参数传入 10 万次/秒,CPU 缓存带宽和寄存器压力会显著上升。
- 方法签名含
MyLargeStruct s(而非ref MyLargeStruct s)→ 每次调用复制全部字段 - 放进
List→ 扩容时整块内存 memcpy,比List的指针数组复制重得多 - 被闭包捕获或用在 async 方法中 → 可能被提升为堆分配(.NET 5+ 对 ref struct 有严格限制,普通 struct 也可能逃逸)
高并发典型场景下的实测建议
以高频消息处理(如 WebSocket 心跳包解析、订单快照生成)为例,优先用 struct,但必须满足「小、不可变、无引用字段」三原则:
public readonlystruct OrderSnapshot { public readonly long OrderId; public readonly decimal Price; public readonly int Status; public readonly DateTime Timestamp; public OrderSnapshot(long id, decimal price, int status, DateTime ts) { OrderId = id; Price = price; Status = status; Timestamp = ts; } }
- 字段全用
readonly,避免意外修改引发线程安全问题 - 不含
string、List、object等引用类型字段(否则仍需 GC 管理) - 构造函数不调用虚方法、不触发静态构造器或复杂初始化逻辑
- 若需序列化,用
Span+BinaryPrimitives直接写入,避开JsonSerializer.Serialize的反射开销
容易被忽略的陷阱:struct 的线程局部性假象
很多人以为 struct 天然线程安全,其实不然。多个线程操作同一个可变 struct 实例(比如共享在 static 字段或 ConcurrentQueue 中)会导致读写撕裂——因为 struct 复制是逐字段进行的,非原子。
-
public static MyMutableStruct SharedData;→ 线程 A 写SharedData.X,线程 B 同时读整个SharedData,可能拿到 X 新值 + Y 旧值 - 即使加了
lock,若锁粒度覆盖不到所有字段访问路径,仍可能出错 - 正确做法:要么彻底不可变(
readonly struct),要么改用class+ 显式同步,或者用Interlocked操作单个字段
# js
# json
# 字节
# websocket
# 栈
# c#
# .net
# 为什么
# red
# Static
# String
# Object
# 构造函数
# 结构体
# 循环
# 指针
# 堆
# class
# 值类型
# 引用类型
# public
# Struct
# 线程
# 值传递
# 引用传递
# 闭包
# 并发
# 对象
# 多个
# 更快
# 过大
# 尤其是
# 什么时候
# 很多人
# 而在
# 得多
# 能让
# 为例
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel如何实现用户注册和登录?(Auth脚手架指南)
zabbix利用python脚本发送报警邮件的方法
Laravel如何使用withoutEvents方法临时禁用模型事件
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Java类加载基本过程详细介绍
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
如何正确选择百度移动适配建站域名?
linux写shell需要注意的问题(必看)
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
如何在阿里云部署织梦网站?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Android实现代码画虚线边框背景效果
米侠浏览器网页背景异常怎么办 米侠显示修复
PHP正则匹配日期和时间(时间戳转换)的实例代码
BootStrap整体框架之基础布局组件
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
详解阿里云nginx服务器多站点的配置
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
制作企业网站建设方案,怎样建设一个公司网站?
晋江文学城电脑版官网 晋江文学城网页版直接进入
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何用美橙互联一键搭建多站合一网站?
如何撰写建站申请书?关键要点有哪些?
三星、SK海力士获美批准:可向中国出口芯片制造设备
js代码实现下拉菜单【推荐】
网站建设整体流程解析,建站其实很容易!
如何在服务器上三步完成建站并提升流量?
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何在IIS中配置站点IP、端口及主机头?
在线教育网站制作平台,山西立德教育官网?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何做网站制作流程,*游戏网站怎么搭建?
如何快速搭建虚拟主机网站?新手必看指南
Linux安全能力提升路径_长期防护思维说明【指导】
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Laravel API资源类怎么用_Laravel API Resource数据转换
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
怎么用AI帮你为初创公司进行市场定位分析?
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Swift中循环语句中的转移语句 break 和 continue
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】


struct OrderSnapshot
{
public readonly long OrderId;
public readonly decimal Price;
public readonly int Status;
public readonly DateTime Timestamp;
public OrderSnapshot(long id, decimal price, int status, DateTime ts)
{
OrderId = id;
Price = price;
Status = status;
Timestamp = ts;
}
}