Dojo
最新
最佳
搜索
订阅
解道Jdon
架构设计
领域驱动
DDD介绍
DDD专辑
战略建模
领域语言UL
领域事件
商业分析
工作流BPM
规则引擎
架构师观点
数据工程
产品经理
系统思维
微服务
微服务介绍
微服务专辑
模块化设计
SOA
API设计
clean架构
SpringBoot
分布式事务
分布式架构
Kubernetes
DevOps
编程设计
GoF设计模式
模式专辑
面向对象
函数式编程
编程语言比较
编程工具比较
形式逻辑
前端编程
Reactive编程
Jdon框架
Rust语言
人工智能
Web3
模因梗
幽默梗
程序员吐槽
面试技巧
Java入门
数字化转型
认知偏差
道德经
更多话题
BucketMap:golang快速并发 HashMap 开源实现
23-01-09
banq
一个非常快速、线程安全、简单的 hashmap 实现。
在高度竞争的情况下,它比sync.Map和带mutexes的map快4-10倍以上;所需的堆空间是sync.Map的25%-50%,如果在堆中分配,所需的堆空间是默认map的66%-90%(默认map可以是堆分配);使sync.Map的堆分配量减少33%-50%。
它被设计成一个通用的并发映射,没有明显的缺点,针对高度竞争的用例进行了优化,其中大量读取/插入/删除是并行发生的。
特征:
正确的。
良好的兼容性:使用 uint 代替 uint32/uint64 更好地支持 32 位系统。
完全非阻塞,没有忙等待读取。
使用原子和锁的组合进行快速插入/删除操作。当失败的原子操作导致过多的额外工作时,使用锁来简化事情。
便宜的(速度和内存)扩展/收缩操作。
内存高效且快速。
简单,易于理解(imo),并且易于根据您自己的需要进行更改。
高度可定制。您可以指定哈希值的范围,如果它们自己分布良好以实现最佳性能。内存/速度权衡非常明显。
保证顺序可见性。如果操作 A 在 B 完成后的任何时间开始,则 B 对 A 可见。如果 A 在 B 完成之前开始,则 B 对 A 不可见。没有中间状态。
易于使用:使用与 sync.Map 相同的接收者签名和行为。
支持原始键类型以及任意结构作为键类型。允许键和值的零值。
缺点:
使用链表,因此可能未针对缓存进行优化。
对错误的散列值没有弹性(因为没有内部散列函数)。为了解决这个问题,我提供了一个使用 stl 中的 hash/maphash 的通用内存哈希器。我听说 xxHash 是一个不错的选择。
由于过于可定制,无法适应不良参数。
由于链表导致的频繁分配/释放内存,可能会给 GC 带来一些压力。
有关详细信息和基准,请参阅
https://github.com/GM-twostay/Go-Utils/blob/master/Maps/ChainMap/README.md
。
Go语言
并发编程
GitHub开源免费源代码