golang的加锁map与syncmap性能分析

6 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值