faststringmap icon indicating copy to clipboard operation
faststringmap copied to clipboard

faststringmap is only faster when keys are shorter 7 symbols

Open zhulik opened this issue 3 years ago • 0 comments

I was evaluating faststringmap for my use case and wrote a benchmark that compares lookup times of standard map and faststringmap. In the beginning the key length was 36 symbols(length of a UUID with dashes), the result of faststringmap was about 10 times worse than the result of standard map. So I limited the length of the keys in my benchmark to 6 and only then faststringmap became faster:

package trie_test

import (
	"testing"

	"github.com/google/uuid"
	"github.com/sensiblecodeio/faststringmap"
)

const (
	keysCount = 1000
)

type exampleSource map[string]uint32

func (s exampleSource) AppendKeys(a []string) []string {
	for k := range s {
		a = append(a, k)
	}
	return a
}

func (s exampleSource) Get(k string) uint32 {
	return s[k]
}

var (
	keys    []string
	hashMap exampleSource
	fastMap faststringmap.Uint32Store
)

func init() {
	keys = make([]string, keysCount)

	hashMap = exampleSource{}

	for i := 0; i < keysCount; i++ {
		keys[i] = uuid.NewString()[0:6]
		hashMap[keys[i]] = 1
	}

	fastMap = faststringmap.NewUint32Store(hashMap)
}

func BenchmarkMap(b *testing.B) {
	for i := 0; i < b.N; i++ {
		for _, key := range keys {
			if v, ok := hashMap[key]; v != 1 || !ok {
				b.Fail()
			}
		}
	}
}

func BenchmarkFastStringMap(b *testing.B) {
	for i := 0; i < b.N; i++ {
		for _, key := range keys {
			if v, ok := fastMap.LookupString(key); v != 1 || !ok {
				b.Fail()
			}
		}
	}
}

Results for key length of 36:

goos: linux
goarch: amd64
pkg: github.com/zhulik/go-eventbus/trie
cpu: AMD Ryzen 7 PRO 5850U with Radeon Graphics     
BenchmarkMap-16                   134596              8464 ns/op
BenchmarkFastStringMap-16          14326             84213 ns/op
PASS
ok      github.com/zhulik/go-eventbus/trie      3.311s

Results for key length of 6:

goos: linux
goarch: amd64
pkg: github.com/zhulik/go-eventbus/trie
cpu: AMD Ryzen 7 PRO 5850U with Radeon Graphics     
BenchmarkMap-16                   132898              8484 ns/op
BenchmarkFastStringMap-16         140976              8254 ns/op
PASS
ok      github.com/zhulik/go-eventbus/trie      2.495s

Am I cooking the data structure wrong, or it is by design?

zhulik avatar May 29 '22 13:05 zhulik