shad-go/keylock/speed_test.go
Fedor Korotkiy 6895b42808 Fix
2022-03-18 23:25:42 +03:00

89 lines
1.4 KiB
Go

package keylock
import (
"math/rand"
"strconv"
"sync"
"testing"
)
func BenchmarkMutex_Baseline(b *testing.B) {
var mu sync.Mutex
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
mu.Lock()
_ = 0
mu.Unlock()
}
})
}
func BenchmarkKeyLock_SingleKey(b *testing.B) {
l := New()
keys := []string{"a"}
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, unlock := l.LockKeys(keys, nil)
unlock()
}
})
}
func BenchmarkKeyLock_MultipleKeys(b *testing.B) {
l := New()
keys := []string{"a", "b", "c", "d"}
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, unlock := l.LockKeys(keys, nil)
unlock()
}
})
}
func BenchmarkKeyLock_DifferentKeys(b *testing.B) {
l := New()
b.ReportAllocs()
b.RunParallel(func(pb *testing.PB) {
keys := []string{strconv.Itoa(rand.Int())}
for pb.Next() {
_, unlock := l.LockKeys(keys, nil)
unlock()
}
})
}
func BenchmarkKeyLock_NoBusyWait(b *testing.B) {
l := New()
lockedKey := []string{"locked"}
l.LockKeys(lockedKey, nil)
cancel := make(chan struct{})
defer close(cancel)
for i := 0; i < 1000; i++ {
go func() {
l.LockKeys(lockedKey, cancel)
}()
}
b.ResetTimer()
openKey := []string{"a"}
for i := 0; i < b.N; i++ {
canceled, unlock := l.LockKeys(openKey, nil)
if canceled {
b.Fatal("spurious lock fail")
}
unlock()
}
}