在基准测试中,在并发安全的情况下sync.Map会比我们常用的map+读写锁更加的快,快了五倍,这是得以于只读read设计,减低锁的粒度。但是利用读写锁的话,我们存储的不是一个简单数据类型,而是一个指针对象,那么用普通map+读写锁能很好地控制锁的粒度,达到更好的操作。
package main
import (
"sync"
"testing"
)
func BenchmarkMap(b *testing.B) {
rwLock := sync.RWMutex{}
mapA := make(map[int]int)
for i := 0; i < b.N; i++ {
rwLock.Lock()
mapA[i] = i
rwLock.Unlock()
rwLock.RLock()
_ = mapA[i]
rwLock.RUnlock()
}
}
func BenchmarkSyncMap(b *testing.B) {
mapB := sync.Map{}
for i := 0; i < b.N; i++ {
mapB.Store(i, i)
iX, ok := mapB.Load(i)
if ok {
_ = iX.(int)
}
}
}
测试结果
go test map_test.go -bench=.
goos: linux
goarch: amd64
BenchmarkMap-12 5000000 271 ns/op
BenchmarkSyncMap-12 1000000 1085 ns/op
PASS
ok command-line-arguments 2.734s
网友评论