Created
September 10, 2017 04:10
-
-
Save deckarep/06a3c83c2458eca49c8826faf0ca39e8 to your computer and use it in GitHub Desktop.
Concurrent benchmarks of both sync.Map and a regular RWMutex locked map.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func benchmarkRegularStableKeys(b *testing.B, workerCount int) { | |
runtime.GOMAXPROCS(workerCount) | |
rm := NewRegularIntMap() | |
populateMap(b.N, rm) | |
var wg sync.WaitGroup | |
wg.Add(workerCount) | |
// Holds our final results, to prevent compiler optimizations. | |
globalResultChan = make(chan int, workerCount) | |
b.ResetTimer() | |
for wc := 0; wc < workerCount; wc++ { | |
go func(n int) { | |
currentResult := 0 | |
for i := 0; i < n; i++ { | |
currentResult, _ = rm.Load(5) | |
} | |
globalResultChan <- currentResult | |
wg.Done() | |
}(b.N) | |
} | |
wg.Wait() | |
} | |
func benchmarkSyncStableKeys(b *testing.B, workerCount int) { | |
runtime.GOMAXPROCS(workerCount) | |
var sm sync.Map | |
populateSyncMap(b.N, &sm) | |
var wg sync.WaitGroup | |
wg.Add(workerCount) | |
// Holds our final results, to prevent compiler optimizations. | |
globalResultChan = make(chan int, workerCount) | |
b.ResetTimer() | |
for wc := 0; wc < workerCount; wc++ { | |
go func(n int) { | |
currentResult := 0 | |
for i := 0; i < n; i++ { | |
r, ok := sm.Load(5) | |
if ok { | |
currentResult = r.(int) | |
} | |
} | |
globalResultChan <- currentResult | |
wg.Done() | |
}(b.N) | |
} | |
wg.Wait() | |
} | |
func benchmarkRegularStableKeysFound(b *testing.B, workerCount int) { | |
runtime.GOMAXPROCS(workerCount) | |
rm := NewRegularIntMap() | |
values := populateMap(b.N, rm) | |
var wg sync.WaitGroup | |
wg.Add(workerCount) | |
// Holds our final results, to prevent compiler optimizations. | |
globalResultChan = make(chan int, workerCount) | |
b.ResetTimer() | |
for wc := 0; wc < workerCount; wc++ { | |
go func(n int) { | |
currentResult := 0 | |
for i := 0; i < n; i++ { | |
currentResult, _ = rm.Load(values[i]) | |
} | |
globalResultChan <- currentResult | |
wg.Done() | |
}(b.N) | |
} | |
wg.Wait() | |
} | |
func benchmarkSyncStableKeysFound(b *testing.B, workerCount int) { | |
runtime.GOMAXPROCS(workerCount) | |
var sm sync.Map | |
values := populateSyncMap(b.N, &sm) | |
var wg sync.WaitGroup | |
wg.Add(workerCount) | |
// Holds our final results, to prevent compiler optimizations. | |
globalResultChan = make(chan int, workerCount) | |
b.ResetTimer() | |
for wc := 0; wc < workerCount; wc++ { | |
go func(n int) { | |
currentResult := 0 | |
for i := 0; i < n; i++ { | |
r, ok := sm.Load(values[i]) | |
if ok { | |
currentResult = r.(int) | |
} | |
} | |
globalResultChan <- currentResult | |
wg.Done() | |
}(b.N) | |
} | |
wg.Wait() | |
} | |
/* | |
// These tests do a lookup using a literal value. | |
// Regular Map backed by RWMutex | |
BenchmarkRegularStableKeys1-32 50000000 30.5 ns/op | |
BenchmarkRegularStableKeys2-32 10000000 157 ns/op | |
BenchmarkRegularStableKeys4-32 5000000 377 ns/op | |
BenchmarkRegularStableKeys8-32 2000000 701 ns/op | |
BenchmarkRegularStableKeys16-32 1000000 1446 ns/op | |
BenchmarkRegularStableKeys32-32 500000 2825 ns/op | |
BenchmarkRegularStableKeys64-32 200000 5699 ns/op | |
// Sync Map | |
BenchmarkSyncStableKeys1-32 20000000 89.3 ns/op | |
BenchmarkSyncStableKeys2-32 20000000 101 ns/op | |
BenchmarkSyncStableKeys4-32 5000000 247 ns/op | |
BenchmarkSyncStableKeys8-32 5000000 330 ns/op | |
BenchmarkSyncStableKeys16-32 5000000 295 ns/op | |
BenchmarkSyncStableKeys32-32 5000000 269 ns/op | |
BenchmarkSyncStableKeys64-32 5000000 249 ns/op | |
// These tests do a lookup of keys already defined in the map per iteration. | |
// Regular Map backed by RWMutex | |
BenchmarkRegularStableKeysFound1-32 20000000 114 ns/op | |
BenchmarkRegularStableKeysFound2-32 10000000 203 ns/op | |
BenchmarkRegularStableKeysFound4-32 3000000 460 ns/op | |
BenchmarkRegularStableKeysFound8-32 2000000 976 ns/op | |
BenchmarkRegularStableKeysFound16-32 1000000 1895 ns/op | |
BenchmarkRegularStableKeysFound32-32 300000 3620 ns/op | |
BenchmarkRegularStableKeysFound64-32 200000 6762 ns/op | |
// Sync Map | |
BenchmarkSyncStableKeysFound1-32 5000000 357 ns/op | |
BenchmarkSyncStableKeysFound2-32 3000000 446 ns/op | |
BenchmarkSyncStableKeysFound4-32 3000000 501 ns/op | |
BenchmarkSyncStableKeysFound8-32 3000000 576 ns/op | |
BenchmarkSyncStableKeysFound16-32 2000000 566 ns/op | |
BenchmarkSyncStableKeysFound32-32 3000000 527 ns/op | |
BenchmarkSyncStableKeysFound64-32 2000000 873 ns/op | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
populateMap is not defined