0

0

c# ImmutableArray 和 List 加锁的性能和场景对比

畫卷琴夢

畫卷琴夢

发布时间:2026-01-07 03:33:16

|

707人浏览过

|

来源于php中文网

原创

ImmutableArray 无需加锁即可线程安全读取,但每次写操作都复制整个数组,性能远低于加锁的 List;适用场景为初始化后极少修改的只读集合或需值语义比较的场合。

c# immutablearray<t> 和 list<t> 加锁的性能和场景对比

ImmutableArray 不需要加锁,但写操作代价高

ImmutableArray 是不可变结构体,所有“修改”操作(如 AddSetItem)都返回新实例,底层复制整个数组。它本身线程安全——读取无需加锁,多个线程同时读不会出错,也不存在竞态。但如果你频繁调用 array.Add(item) 并期望“累积修改”,实际是在反复分配新数组,GC 压力和内存拷贝开销会迅速上升。

常见错误现象:
• 用 for 循环反复 Add 构建集合,性能比 List 慢数十倍
• 误以为 ImmutableArray 是“高性能无锁集合”,却在写密集场景滥用

适用场景:
• 配置数据、查找表等初始化后极少变更的只读集合
• 函数式风格管道处理(如 .Select(...).Where(...).ToArray() 后转为 ImmutableArray 固化结果)
• 需要值语义比较(==.Equals 判断内容是否相同)

List 加锁是唯一线程安全写方式,但粒度很关键

List 本身不是线程安全的。多线程同时调用 AddRemoveAt 或遍历中修改,会触发 InvalidOperationException(“集合已修改”)或静默数据损坏。必须显式加锁,但锁的范围直接影响吞吐量。

容易踩的坑:
• 对整个 List 操作都用同一个 lock(obj),变成串行执行,失去并发意义
• 在 foreach 遍历时加锁,但未覆盖全部读路径(比如其他地方有裸读),仍可能遇到 Collection was modified
• 锁对象暴露给外部(如 lock(list)),引发死锁或意外争用

实操建议:
• 用私有 readonly object 字段做锁对象:private readonly object _sync = new();
• 写操作(AddClear)必须锁;纯读(Countthis[index])可不锁,但需接受可能看到“过期”状态
• 若写操作占比 >10%,考虑改用 ConcurrentBagConcurrentQueue 等真正并发集合

性能对比:小数据量差异不大,大数据量写操作 ImmutableArray 明显更慢

在 1000 个元素内,ImmutableArray.Add 和加锁 List.Add 的单次耗时差距不明显(纳秒级),但前者每次分配新数组,后者只是扩容(摊还 O(1))。当循环添加 10 万次:

XpShop商城系统 最新版
XpShop商城系统 最新版

XpShop商城系统是新普软件开发有限公司针对大型连锁超市、百货公司、网上大卖场推出的一款结合ERP库存管理的网上商店系统,网上商城系统,也是新普软件公司大型电子商务解决方案中的一款软件产品。 XpShop v2012版本采用.net framework 3.5,mssql 2005,系统框架重新设计,功能更加的强大,访问速度和系统性能都得到了很大的提升。此外,秉承"简单体验科技&qu

下载
var list = new List();
var array = ImmutableArray.Empty;
var sw = Stopwatch.StartNew();

// List + lock
for (int i = 0; i < 100000; i++) {
    lock (_sync) list.Add(i);
}
sw.Restart();
// ImmutableArray
for (int i = 0; i < 100000; i++) {
    array = array.Add(i); // 每次都 new int[i+1] 并 copy
}

后者实际执行约 50 亿次数组元素拷贝(1+2+3+…+100000 ≈ 5e9),而前者仅约 17 次扩容(2→4→8→…→131072),耗时差可达 100 倍以上。

参数差异:
ImmutableArray 构造成本低(可由 Array.AsImmutable() 零拷贝创建),但写成本高
List 构造无开销,写成本低,但并发写必须自行保证同步

真正该选哪个?看数据生命周期而非“是否要锁”

别纠结“哪个更快加锁”,先问:这个集合的典型使用模式是什么?

ImmutableArray 当:
• 数据构建一次,后续只读(如解析 JSON 后的配置项缓存)
• 需要跨线程传递且不允许被意外修改(避免防御性克隆)
• 要利用其 struct 特性减少 GC(但注意:大数组传参会复制)

选加锁 List 当:
• 写操作频繁且无法预估总量(如实时日志缓冲区)
• 已有代码重度依赖 List API(索引访问、SortBinarySearch
• 并发度不高(如 2~4 个生产者),锁争用可控

容易被忽略的点:
ImmutableArray.ToBuilder() 返回可变包装器,内部仍用数组,适合“批量构建+固化”场景,比反复 Add 高效得多
• 如果读远多于写,又要求强一致性,ReaderWriterLockSlim 比简单 lock 更合适,但复杂度上升

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

406

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

531

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

308

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.11.20

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

381

2023.09.04

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

40

2025.12.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号