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

你可能感兴趣的:(go,go涉猎,编程基础)