I ran benchmarks comparing xsync.Map's memory allocation against orcaman/concurrent-map. Pure overwrite workload (pre-allocated values): xsync.Map: 24 B/op 1 alloc/op 31.89 ns/op orcaman/concurrent-map: 0 B/op 0 alloc/op 70.72 ns/op Real-world mixed (80% overwrites, 20% new): xsync.Map: 57 B/op 2 allocs/op 218.1 ns/op orcaman/concurrent-map: 63 B/op 3 allocs/op 283.1 ns/op Go maps reuse memory on overwrites, which is…
Benchmarks for concurrent hash map implementations in Go
11–20 of 27 posts
Re: Benchmarks for concurrent hash map implementations in Go
#12Re: Benchmarks for concurrent hash map implementations in Go
#13I ran benchmarks comparing xsync.Map's memory allocation against orcaman/concurrent-map. Pure overwrite workload (pre-allocated values): xsync.Map: 24 B/op 1 alloc/op 31.89 ns/op orcaman/concurrent-map: 0 B/op 0 alloc/op 70.72 ns/op Real-world mixed (80% overwrites, 20% new): xsync.Map: 57 B/op 2 allocs/op 218.1 ns/op orcaman/concurrent-map: 63 B/op 3 allocs/op 283.1 ns/op Go maps reuse memory on overwrites, which is…
How does reuse avoid false sharing between cores? Since this is concurrent hashmap we are talking about.
Re: Benchmarks for concurrent hash map implementations in Go
#14Re: Benchmarks for concurrent hash map implementations in Go
#15Earlier quoted context omitted.
How does reuse avoid false sharing between cores? Since this is concurrent hashmap we are talking about.
I focused on B/op because it was the only apparent weakness I saw. My “reuse” note was about allocation behavior, not false sharing. We’re talking about different concerns.
Is that what you meant? Because if it is then you now have potential for the problem I described.
Re: Benchmarks for concurrent hash map implementations in Go
#16Looks good! There's an important thing missing from the benchmarks though: - cpu usage under concurrency: many of these spin-lock or use atomics, which can use up to 100% cpu time just spinning. - latency under concurrency: atomics cause cache-line bouncing which kills latency, especially p99 latency
Re: Benchmarks for concurrent hash map implementations in Go
#17[dead]
Re: Benchmarks for concurrent hash map implementations in Go
#18Will we also eventually get a generic sync.Map?
Re: Benchmarks for concurrent hash map implementations in Go
#19A few release cycles back, Swiss Maps became popular (i think, particular thanks to CockroachDB) as a replacement for standard Go map[K]V. Later, Go's stdlib map implementation was updated to use Swiss Maps internally and everyone benefited. Do you think the xsync.Map could be considered for upstreaming? Especially if it outperforms sync.Map at all the same use cases.
Re: Benchmarks for concurrent hash map implementations in Go
#20Orcaman is a very straightforward implementation (just sharded RW locks and backing maps), but it limits the number of shards to a fixed 32. I wonder what the benchmarks would look like if the shard count were increased to 64, 128, etc.