golang的加鎖map與syncmap性能分析

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章