gotosocial/vendor/github.com/dolthub/swiss
kim c06e6fb656
[performance] update go-structr and go-mutexes with memory usage improvements (#2909)
* update go-structr and go-mutexes with memory usage improvements

* bump to go-structr v0.8.4
2024-05-13 08:05:46 +00:00
..
simd [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00
.gitignore [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00
bits.go [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00
bits_amd64.go [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00
LICENSE [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00
map.go [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00
README.md [performance] update go-structr and go-mutexes with memory usage improvements (#2909) 2024-05-13 08:05:46 +00:00

SwissMap

SwissMap is a hash table adapated from the "SwissTable" family of hash tables from Abseil. It uses AES instructions for fast-hashing and performs key lookups in parallel using SSE instructions. Because of these optimizations, SwissMap is faster and more memory efficient than Golang's built-in map. If you'd like to learn more about its design and implementation, check out this blog post announcing its release.

Example

SwissMap exposes the same interface as the built-in map. Give it a try using this Go playground.

package main

import "github.com/dolthub/swiss"

func main() {
	m := swiss.NewMap[string, int](42)

	m.Put("foo", 1)
	m.Put("bar", 2)

	m.Iter(func(k string, v int) (stop bool) {
		println("iter", k, v)
		return false // continue
	})

	if x, ok := m.Get("foo"); ok {
		println(x)
	}
	if m.Has("bar") {
		x, _ := m.Get("bar")
		println(x)
	}

	m.Put("foo", -1)
	m.Delete("bar")

	if x, ok := m.Get("foo"); ok {
		println(x)
	}
	if m.Has("bar") {
		x, _ := m.Get("bar")
		println(x)
	}

	m.Clear()

	// Output:
	// iter foo 1
	// iter bar 2
	// 1
	// 2
	// -1
}