goboxのshardmap

1514 ワード

今日はgoboxの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の書き込みパフォーマンスの比較:
  • 原生map
  • BenchmarkSimpleMapWrite-4         300000          5935 ns/op
    
  • sync.Map
  • BenchmarkSyncMapWrite-4       200000          6831 ns/op
    
  • ShardMap
  • BenchmarkShardMapWrite-4      300000          3815 ns/op
    

    皆さんのご利用を歓迎します.使用中に問題が発生したら、いつでもフィードバックします.できるだけ早く応答します.ありがとうございます.