syncmap是golang1.5引入的線程安全的map,以下是測試程序,結論: 不建議使用sync.map, 原因: 1. 性能不及加鎖的map, 2. 對json不友好
測試程序:
package main_test
import (
"math/rand"
"sync"
"testing"
)
type WrapedMap struct {
lck sync.Mutex
m map[int]int
}
var normalMap WrapedMap
var syncMap sync.Map
func TestMain(m *testing.M) {
normalMap = WrapedMap{
lck: sync.Mutex{},
m: make(map[int]int, 100000),
}
m.Run()
}
func BenchmarkLockMapWrite(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
a := rand.Intn(100) + 1
b := rand.Intn(a)
normalMap.lck.Lock()
normalMap.m[a] = b
normalMap.lck.Unlock()
}
})
}
func BenchmarkLockMapRead(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
a := rand.Intn(100) + 1
normalMap.lck.Lock()
_, _ = normalMap.m[a]
normalMap.lck.Unlock()
}
})
}
func BenchmarkSyncMapWrite(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
a := rand.Intn(100) + 1
b := rand.Intn(a)
syncMap.Store(a, b)
}
})
}
func BenchmarkSyncMapRead(b *testing.B) {
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
a := rand.Intn(100) + 1
syncMap.Load(a)
}
})
}
運行結果:
goos: windows
goarch: amd64
pkg: learning/go_demo/sync_map
BenchmarkLockMapWrite-8 10000000 220 ns/op
BenchmarkLockMapRead-8 20000000 110 ns/op
BenchmarkSyncMapWrite-8 5000000 333 ns/op
BenchmarkSyncMapRead-8 10000000 133 ns/op
PASS
ok learning/go_demo/sync_map 8.664s