golang-design / under-the-hood

📚 Go: Under The Hood | Go 语言原本 | https://golang.design/under-the-hood

Home Page:https://golang.design/under-the-hood

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

更新 sync.Map 基准测试

l-qing opened this issue · comments

问题描述1

原文中的"在两种情况下由于普通的 map+mutex",这句不知道是什么意思.

sync.Map 宣称内部做了特殊的优化,在两种情况下由于普通的 map+mutex。

https://github.com/golang-design/under-the-hood/blame/023270d971dc5c19e997e2277dfce4c172e92c67/book/zh-cn/part1basic/ch05sync/map.md#L8

问题描述2

这个性能对比图,不太明白纵坐标是什么意思。
在我的印象中,系统的sync.Map在读多写少的场景下是有优势的。
不知道这个图能不能体现出这个特性?

map-syncmap

在测试中,我们测试了:n 个 key 中,每个 key 产生 1 次写行为,每个 key 产生 n 次读行为。
图1:map+sync.Mutex 、map+sync.RWMutex与 sync.Map 之间单次写多次读场景下的性能对比

https://github.com/golang-design/under-the-hood/blame/023270d971dc5c19e997e2277dfce4c172e92c67/book/zh-cn/part1basic/ch05sync/map.md#L13-L16

第一个问题是一个 typo 错误,应该更改为如下:

-sync.Map 宣称内部做了特殊的优化,在两种情况下由于普通的 map+mutex。
+sync.Map 宣称内部做了特殊的优化,在两种情况下优于普通的 map+mutex。

第二个问题就是在比较读多写少的性能 纵轴表示的应该是该场景下一次读或者一次写的性能。我暂时找不到原始的基准测试代码了,可能在仓库的某个角落,也可能在某个我的某个public仓库里,考虑到最近几个版本的运行时改进,该图可能已经过时,可以考虑重做完整的基准测试。

PR welcome。