在基準(zhǔn)測試中,在并發(fā)安全的情況下sync.Map會比我們常用的map+讀寫鎖更加的快,快了五倍,這是得以于只讀read設(shè)計(jì),減低鎖的粒度。但是利用讀寫鎖的話,我們存儲的不是一個(gè)簡單數(shù)據(jù)類型,而是一個(gè)指針對象,那么用普通map+讀寫鎖能很好地控制鎖的粒度,達(dá)到更好的操作。
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)
}
}
}
測試結(jié)果
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