golang 中 map 性能优化[低阶]
简单介绍
golang 中的 build-in 的 map 这个 map 是非线程安全的,但是也是最常用的一个家伙。 为了测试多个 map 的性能我写了个接口 Map
type Map interface {
Set(key interface{}, val interface{})
Get(key interface{}) (interface{}, bool)
Del(key interface{})
}
然后这是封装的普通的 map
type OriginMap struct {
m map[interface{}]interface{}
}
func NewOriginMap() *OriginMap {
return &OriginMap{m: make(map[interface{}]interface{})}
}
func (o *OriginMap) Get(key interface{}) (interface{}, bool) {
v, ok := o.m[key]
return v, ok
}
func (o *OriginMap) Set(key interface{}, value interface{}) {
o.m[key] = value
}
func (o *OriginMap) Del(key interface{}) {
delete(o.m, key)
}
别看一堆代码,其实就是 get 和 set 操作。在这里我们要使用 golang 自带的 test 工具
func TestOriginMaps(t *testing.T) {
hm := NewOriginMap()
wg := sync.WaitGroup{}
for i := 0; i < Writer; i++ {
wg.Add(1)
go func(wg *sync.WaitGroup) {
for k := 0; k < 100; k++ {
hm.Set(strconv.Itoa(k), k*k)
val, _ := hm.Get(strconv.Itoa(k))
t.Logf("Get %d = %d", k, val)
}
wg.Done()
}(&wg)
}
wg.Wait()
}
这其中有个变量 Writer 就是写者的数量,如果只有 1 的时候程序能安全运行退出
1264 ± : go test map_test/map_performance_test.go -v ⏎ [3h1m] ✹ ✚ ✭
=== RUN TestOriginMaps
--- PASS: TestOriginMaps (0.00s)
map_performance_test.go:71: Get