shad-go/keylock/speed_test.go

75 lines
1.2 KiB
Go

package keylock
import (
"math/rand"
"strconv"
"testing"
)
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()
}
}