一个 Golang 无锁线程安全的 HashMap,针对最快的读取访问进行优化。
m := Newuint8, int
m.Set(1, 123)
value, ok := m.Get(1)
字符串类型键的哈希表使用示例:
m := Newstring, int
m.Set("amount", 123)
value, ok := m.Get("amount")
使用哈希表统计 URL 请求:
m := Newstring, *int64
var i int64
counter, _ := m.GetOrInsert("api/123", &i)
atomic.AddInt64(counter, 1) // increase counter
...
count := atomic.LoadInt64(counter) // read counter
## 基准测试 以线程安全的方式从哈希表中读取数值类型键比以不安全的方式从标准 Golang map 中读取要快,并且比 Golang 的 `sync.Map` 快三倍:
ReadXsyncMapUint-8 924.5n ± ∞ ¹
ReadHashMapUint-8 1.072µ ± ∞ ¹
ReadHaxMapUint-8 1.296µ ± ∞ ¹
ReadGoMapUintUnsafe-8 1.318µ ± ∞ ¹
ReadGoSyncMapUint-8 3.389µ ± ∞ ¹
ReadSkipMapUint-8 4.820µ ± ∞ ¹
ReadGoMapUintMutex-8 32.62µ ± ∞ ¹
在写入操作发生时从哈希表中读取:
ReadHashMapWithWritesUint-8 1.235µ ± ∞ ¹
ReadHaxMapWithWritesUint-8 1.433µ ± ∞ ¹
ReadGoSyncMapWithWritesUint-8 4.503µ ± ∞ ¹
在没有并发读取的情况下,写入性能:
WriteGoMapMutexUint-8 21.72µ ± ∞ ¹
WriteHashMapUint-8 27.99µ ± ∞ ¹
WriteGoSyncMapUint-8 78.43µ ± ∞ ¹
* 技术设计决策是基于存储在外部仓库中的基准测试做出的:
* 库使用一个排序链表和一个切片作为该链表的索引。
[go-benchmark](https://github.com/cornelk/go-benchmark)暂无开放 Issues,或尚未同步最近议题。