goboxのshardmap
1514 ワード
今日はgoboxのshardmapについてお話しします.
golangのmapは使いやすいですが、同時書き込みではロックをかけないとpanicになるので性能が悪いです.
shardmapはこの問題を解決するためであり、その核心思想は複数のmapを作成することによってkeyをhashとしてこの複数のmapに割り当て、ロック粒度を減らして性能を向上させることである.
ここではgolangのオリジナルmapやsyncパッケージで提供されているsyncも作りました.Mapの書き込みパフォーマンスの比較:原生map sync.Map ShardMap
皆さんのご利用を歓迎します.使用中に問題が発生したら、いつでもフィードバックします.できるだけ早く応答します.ありがとうございます.
golangのmapは使いやすいですが、同時書き込みではロックをかけないとpanicになるので性能が悪いです.
shardmapはこの問題を解決するためであり、その核心思想は複数のmapを作成することによってkeyをhashとしてこの複数のmapに割り当て、ロック粒度を減らして性能を向上させることである.
使用例
package main
import (
"github.com/goinbox/shardmap"
"github.com/goinbox/crypto"
"fmt"
"strconv"
)
func main() {
shardMap := shardmap.New(32)
hasError:=false
for i := 0; i < 10000; i++ {
key := crypto.Md5String([]byte(strconv.Itoa(i)))
shardMap.Set(key, i)
v, ok := shardMap.Get(key)
if !ok || v != i {
hasError = true
fmt.Println(v, ok)
}
}
if !hasError {
fmt.Println("shardmap set get ok")
}
shardMap.Walk(func(k string, v interface{}) {
shardMap.Del(k)
_, ok := shardMap.Get(k)
if ok {
fmt.Println(v, ok)
}
})
}
出力エフェクトの例
shardmap set get ok
パフォーマンスの比較
ここではgolangのオリジナルmapやsyncパッケージで提供されているsyncも作りました.Mapの書き込みパフォーマンスの比較:
BenchmarkSimpleMapWrite-4 300000 5935 ns/op
BenchmarkSyncMapWrite-4 200000 6831 ns/op
BenchmarkShardMapWrite-4 300000 3815 ns/op
皆さんのご利用を歓迎します.使用中に問題が発生したら、いつでもフィードバックします.できるだけ早く応答します.ありがとうございます.