Map Benchmark
This benchmark tests the performance of regular maps versus sync.Maps focusing on the primitive operations of get, put, and delete while under contention. For the use case of AIStore, we want the read times to be as fast as possible.
Getting started
Run
$ go run main.go -maxsize 1000000
This will start the benchmark with the map size to be 1 million elements.
The list of available options are:
-iter
int - Number of iterations to run (default 10)
-maxsize
int - Maximum size of map (default 1000000)
-minsize
int - Shrink size of map (default 10000)
-numread
int - Number of random reads (default 200000)
-putpct
int - Percentage of puts (default 10)
-shrink
bool - Enable shrink (deletion) of map keys (default true)
-workers
int - Number of Read/Write go-routines (default 8)
Result
From the results of the benchmark, sync.Map
does appear to out perform regular maps for read operations when there is contention from multiple go routines. The performance of sync.Map
for put and delete operations are usually slower than regular maps, but if we expect > 80%
of the requests to be reads, sync.Map will be faster than regular maps. Overall, if we expect that the maps will have much higher read requests than put/delete requests, sync.Maps
are the better option.