map和sync.map基准测试

在基准测试中,在并发安全的情况下sync.Map会比我们常用的map+读写锁更加的快,快了五倍,这是得以于只读read设计,减低锁的粒度。但是利用读写锁的话,我们存储的不是一个简单数据类型,而是一个指针对象,那么用普通map+读写锁能很好地控制锁的粒度,达到更好的操作。

package main

import (
    "sync"
    "testing"
)

func BenchmarkMap(b *testing.B) {
    rwLock := sync.RWMutex{}
    mapA := make(map[int]int)
    for i := 0; i < b.N; i++ {
        rwLock.Lock()
        mapA[i] = i
        rwLock.Unlock()
        rwLock.RLock()
        _ = mapA[i]
        rwLock.RUnlock()
    }
}

func BenchmarkSyncMap(b *testing.B) {
    mapB := sync.Map{}
    for i := 0; i < b.N; i++ {
        mapB.Store(i, i)
        iX, ok := mapB.Load(i)
        if ok {
            _ = iX.(int)
        }
    }
}

测试结果

go test map_test.go -bench=.
goos: linux
goarch: amd64
BenchmarkMap-12          5000000               271 ns/op
BenchmarkSyncMap-12      1000000              1085 ns/op
PASS
ok      command-line-arguments  2.734s
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容