Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mhmtszr/concurrent-swiss-map
A high-performance, thread-safe generic concurrent hash map implementation with Swiss Map.
https://github.com/mhmtszr/concurrent-swiss-map
Last synced: 2 days ago
JSON representation
A high-performance, thread-safe generic concurrent hash map implementation with Swiss Map.
- Host: GitHub
- URL: https://github.com/mhmtszr/concurrent-swiss-map
- Owner: mhmtszr
- License: mit
- Created: 2023-08-05T06:47:51.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-04-25T06:57:30.000Z (9 months ago)
- Last Synced: 2024-10-17T00:13:47.945Z (3 months ago)
- Language: Go
- Size: 389 KB
- Stars: 220
- Watchers: 3
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Concurrent Swiss Map [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][go-report-img]][go-report]
**Concurrent Swiss Map** is an open-source Go library that provides a high-performance, thread-safe generic concurrent hash map implementation designed to handle concurrent access efficiently. It's built with a focus on simplicity, speed, and reliability, making it a solid choice for scenarios where concurrent access to a hash map is crucial.
Uses [dolthub/swiss](https://github.com/dolthub/swiss) map implementation under the hood.
## Installation
Supports 1.18+ Go versions because of Go Generics
```
go get github.com/mhmtszr/concurrent-swiss-map
```## Usage
New functions will be added soon...
```go
package mainimport (
"hash/fnv"csmap "github.com/mhmtszr/concurrent-swiss-map"
)func main() {
myMap := csmap.New[string, int](
// set the number of map shards. the default value is 32.
csmap.WithShardCount[string, int](32),// if don't set custom hasher, use the built-in maphash.
csmap.WithCustomHasher[string, int](func(key string) uint64 {
hash := fnv.New64a()
hash.Write([]byte(key))
return hash.Sum64()
}),// set the total capacity, every shard map has total capacity/shard count capacity. the default value is 0.
csmap.WithSize[string, int](1000),
)key := "swiss-map"
myMap.Store(key, 10)val, ok := myMap.Load(key)
println("load val:", val, "exists:", ok)deleted := myMap.Delete(key)
println("deleted:", deleted)ok = myMap.Has(key)
println("has:", ok)empty := myMap.IsEmpty()
println("empty:", empty)myMap.SetIfAbsent(key, 11)
myMap.Range(func(key string, value int) (stop bool) {
println("range:", key, value)
return true
})count := myMap.Count()
println("count:", count)// Output:
// load val: 10 exists: true
// deleted: true
// has: false
// empty: true
// range: swiss-map 11
// count: 1
}
```## Basic Architecture
![img.png](img.png)## Benchmark Test
Benchmark was made on:
- Apple M1 Max
- 32 GB memoryBenchmark test results can be obtained by running [this file](concurrent_swiss_map_benchmark_test.go) on local computers.
![benchmark.png](benchmark.png)
### Benchmark Results
- Memory usage of the concurrent swiss map is better than other map implementations in all checked test scenarios.
- In high concurrent systems, the concurrent swiss map is faster, but in systems containing few concurrent operations, it works similarly to RWMutexMap.[doc-img]: https://godoc.org/github.com/mhmtszr/concurrent-swiss-map?status.svg
[doc]: https://godoc.org/github.com/mhmtszr/concurrent-swiss-map
[ci-img]: https://github.com/mhmtszr/concurrent-swiss-map/actions/workflows/build-test.yml/badge.svg
[ci]: https://github.com/mhmtszr/concurrent-swiss-map/actions/workflows/build-test.yml
[cov-img]: https://codecov.io/gh/mhmtszr/concurrent-swiss-map/branch/master/graph/badge.svg
[cov]: https://codecov.io/gh/mhmtszr/concurrent-swiss-map
[go-report-img]: https://goreportcard.com/badge/github.com/mhmtszr/concurrent-swiss-map
[go-report]: https://goreportcard.com/report/github.com/mhmtszr/concurrent-swiss-map