写点什么

高性能的.NET 不可变数组

  • 2013-07-05
  • 本文字数:1401 字

    阅读完需:约 5 分钟

最新发布的.NET不可变集合中包含了 ImmutableArray,一种在只读、索引化的场景中比 ImmutableList更快速的选择。ImmutableList在设计时选择了一种平衡的方案。由于其复杂的内部结构,添加新项只能是 O(log n) 的操作。同样,通过索引读取某项也要耗费 O(log n) 的时间。

ImmutableArray则没有这么复杂。它只是一个包装了数组的结构。用 ildasm 可以看到,它不包含任何其他字段。这意味着从不可变数组中读取只需要 O(1) 的时间。相反,向不可变数组添加一项则需要对实际数组进行完全拷贝,为 O(n) 操作。

Immo Landwerth 提出了以下建议:

使用不可变数组的理由:

  • 极少更新数据,并且元素数量很小(小于 16)
  • 对迭代数据的性能要求很高
  • 有很多不可变集合的实例,并且无法负担将它们全放在树中的开销。

仍然使用不可变列表的理由:

  • 更新数据比较常见,或者元素数量预计不会太小
  • 对更新集合的性能要求比迭代要高

作为一个值类型,ImmutableArray在创建时不需要显式初始化。此时,结构将检测到内部空指针,其行为就像是长度为 0 的数组。

重大改变

不可变集合正处于开发过程中,重大变更时有发生。这一次,我们看到 Create(IEnumerable items) 函数更名为“From”。

Immo 写到,

我们发现接受 IEnumerable参数的重载可能会产生意想不到的结果。你可能认为要通过其他集合创建集合可以使用接受 IEnumerable参数的重载:

但你最终创建的是 ImmutableList<List> 而不是 Immutable,这是因为在进行重载决策时,参数重载的优先级要高于从 List到 IEnumerable的隐式转换。

因此我们决定将所有操作 IEnumerable的工厂方法改名为 From,以消除这种歧义。

最初的 IImmutableList包含一个 ValueComparer 属性,并匹配 WithComparer 方法。为了让 ImmutableArray保持为一个简单的包装器,就有必要在 IImmutableList接口中移除它们。

扩展方法 GetValueOrDefault 曾经接受一个 IDictionary<TKey, TValue> 或 IReadOnlyDictionary<TKey, TValue>。如果实际的类同时实现了这两个接口就会引起编译器错误,因此用只接受 IImmutableDictaionary<TKey, TValue> 的版本进行了替换。

其他改变

IImmutableSet新增了 TryGetValue 方法。如果使用了比较器如 StringComparer.OrdinalIgnoreCase,并且想得到集中的实际值而不仅仅是判断是否存在等价的元素时,就需要使用该方法了。

不可变集合仍然是预览版,并且不允许在生产中使用。它们目前可用于.NET 4.5、Windows Store、Windows Phone 8 和 Portable Class Library。

数组的性能

Jon Skeet 最近测试了数组的性能并发现了一些有趣的结果。用包装器包装数组竟然可以使它们能够更快地写入。对一个包含 100 项的数组进行 1 亿次写入,字符串数组用了 40.865 秒,而包装的字符数组只用了 29.338 秒。读取速度两者差不多,字符数组用了 12 秒,包装的数组用了 11.843 秒。

其原因要追溯到 Java 了。Java 的数组是协变的,也就是说可以将一个 String[] 传递给任何期望 Object[] 的参数或变量。.NET 的运行时 CLR 要设计为支持 Java,所以也支持协变数组。因此在每次写入数组时 CLR 都需要执行一次类型检查。

Jon Skeet 的数组包装器与我们上面提到的 ImmutableArray 中使用的并不相同。它在内部对数组中的每一项使用了基于结构的包装器。由于它只是一个包含了指针的结构,因此并不比数组中存储的普通引用耗费更多的空间。但其设计可以使 CLR 的 JIT 编译器忽略类型检查。

查看英文原文 High Performance Immutable Arrays in .NET

2013-07-05 06:122599
用户头像

发布了 59 篇内容, 共 25.7 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

金融科技新标杆:随行付大数据实时分析如何支撑百亿级秒级查询

StarRocks

数据库 数据湖 StarRocks 湖仓一体 存算一体

AI 英语写作练习 App 的核心功能

北京木奇移动技术有限公司

软件外包公司 AI英语教育 AI英语写作

百汇通公会健康产业遇上数字金融,一场商业生态的革新

科技汇

OpenAI 由英伟达转向谷歌 TPU,中昊芯英 TPU 技术路线获印证

科技热闻

老实人做的数据库产品,好像也不“老实” !

KaiwuDB

数据库 KaiwuDB

裁判文书网转“内参”,法律检索如何预测裁判结果

科技汇

Golang 语言连接并操作 KWDB 数据库

KaiwuDB

数据库 KaiwuDB

做制造业,那你不能不懂ERP 的五大生产模式!

积木链小链

数字化转型 ERP 智能制造 生产模式

某互联网大厂又要裁员近一万人!

王中阳Go

Go 裁员 大厂

Awesome Python 资源列表维护工具

qife122

Python 资源管理

黑龙江等保测评、等保测评费用

等保测评

KWDB数据库高可用方案验证与测试

KaiwuDB

数据库 KaiwuDB

AI 英语写作练习 App 的开发

北京木奇移动技术有限公司

软件外包公司 AI英语学习 AI英语写作

WebGL 开发数字孪生的技术框架

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

权威认可!天翼云强势入选IDC中国CNAPP领导者象限!

天翼云开发者社区

云原生 天翼云

PD虚拟机必备工具箱!Parallels Toolbox 7 让日常任务变得超简单!实用工具一键搞定!

Rose

Loopback for Mac 为您提供高端演播室混音板的强大功能

Rose

AI 英语教育 App 的技术方案

北京木奇移动技术有限公司

AI技术开发 软件外包公司 AI英语学习

从零开始漏洞赏金猎人的实战指南

qife122

网络安全 赏金猎人

WebGL开发数字孪生项目

北京木奇移动技术有限公司

软件外包公司 数字孪生开发 webgl开发

After Effects 2025 中文汉化安装教程 附AE2025激活补丁最新版

Rose

vec2text 技术已开源!一定条件下,文本嵌入向量可“近乎完美地”还原

Baihai IDP

程序员 AI 向量数据库 rag 检索增强生成

HarmonyOS免密认证方案 助力应用登录安全升级

HarmonyOS SDK

HarmonyOS NEXT harmoyos HarmonyOS SDK应用服务

数智时代:n8n 不够用?试试更懂数据的 HuggingFists

数由科技

人工智能 数据挖掘 低代码 数据科学 huggingfists

开发者必备!Navicat for SQLServer 提供智能查询、ER 图表、数据迁移!

Rose

哪里有CorelDRAW最新序列号?cdr2024 Mac最新序列号及安装教程分享

Rose

KWDB技术架构解析:多模融合、时序引擎与分布式设计的创新实践

KaiwuDB

数据库 KaiwuDB

WinZip for Mac 轻松压缩、保护、共享和管理您的文件

Rose

Active Directory渗透测试实战:从域用户提权到系统控制

qife122

Active Directory 特权提升

大数据-30 ZooKeeper Java-API 监听节点 创建、删除节点

武子康

大数据 hadoop spark zookeeper 分布式

智慧工厂云报工系统(源码+文档+讲解+演示)

深圳亥时科技

高性能的.NET不可变数组_.NET_Jonathan Allen_InfoQ精选文章