plugin/pkg/cache: smarter locking (#1164)
Make the locking slightly smarter in Evict and add benchmark function. Seems a bit faster (there was some variance while performing these benchmarks) Master: BenchmarkCache-2 1000000 2317 ns/op 0 B/op 0 allocs/op BenchmarkCache-2 1000000 2032 ns/op 0 B/op 0 allocs/op This branch: BenchmarkCache-2 1000000 1806 ns/op 0 B/op 0 allocs/op BenchmarkCache-2 1000000 1809 ns/op 0 B/op 0 allocs/op
This commit is contained in:
parent
cb5e82b82e
commit
5aa0d55e72
2 changed files with 17 additions and 4 deletions
11
plugin/pkg/cache/cache.go
vendored
11
plugin/pkg/cache/cache.go
vendored
|
@ -95,19 +95,22 @@ func (s *shard) Remove(key uint32) {
|
||||||
|
|
||||||
// Evict removes a random element from the cache.
|
// Evict removes a random element from the cache.
|
||||||
func (s *shard) Evict() {
|
func (s *shard) Evict() {
|
||||||
s.Lock()
|
|
||||||
defer s.Unlock()
|
|
||||||
|
|
||||||
key := -1
|
key := -1
|
||||||
|
|
||||||
|
s.RLock()
|
||||||
for k := range s.items {
|
for k := range s.items {
|
||||||
key = int(k)
|
key = int(k)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
s.RUnlock()
|
||||||
|
|
||||||
if key == -1 {
|
if key == -1 {
|
||||||
// empty cache
|
// empty cache
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
delete(s.items, uint32(key))
|
|
||||||
|
// If this item is gone between the RUnlock and Lock race we don't care.
|
||||||
|
s.Remove(uint32(key))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get looks up the element indexed under key.
|
// Get looks up the element indexed under key.
|
||||||
|
|
10
plugin/pkg/cache/cache_test.go
vendored
10
plugin/pkg/cache/cache_test.go
vendored
|
@ -29,3 +29,13 @@ func TestCacheLen(t *testing.T) {
|
||||||
t.Fatalf("Cache size should %d, got %d", 2, l)
|
t.Fatalf("Cache size should %d, got %d", 2, l)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkCache(b *testing.B) {
|
||||||
|
b.ReportAllocs()
|
||||||
|
|
||||||
|
c := New(4)
|
||||||
|
for n := 0; n < b.N; n++ {
|
||||||
|
c.Add(1, 1)
|
||||||
|
c.Get(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue