Files
team/server/platform/services/cache/lru_striped_bench_test.go
Agniva De SarkerandGitHub 04dc595061 MM-53032: Fix module path after repo rename (#23689)
It was a good decision in hindsight to keep the public module as 0.x
because this would have been a breaking change again.

https://mattermost.atlassian.net/browse/MM-53032
```release-note
Changed the Go module path from github.com/mattermost/mattermost-server/server/v8 to github.com/mattermost/mattermost/server/v8.

For the public facing module, it's path is also changed from github.com/mattermost/mattermost-server/server/public to github.com/mattermost/mattermost/server/public
```
2023-06-11 10:54:35 +05:30

92 lines
2.0 KiB
Go

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package cache_test
import (
"fmt"
"runtime"
"sync"
"testing"
"github.com/cespare/xxhash/v2"
"github.com/mattermost/mattermost/server/v8/platform/services/cache"
)
const (
m = 500_000
)
func BenchmarkLRUStriped(b *testing.B) {
opts := cache.LRUOptions{
Name: "",
Size: 128,
DefaultExpiry: 0,
InvalidateClusterEvent: "",
StripedBuckets: runtime.NumCPU() - 1,
}
cache, err := cache.NewLRUStriped(opts)
if err != nil {
panic(err)
}
// prepare keys and initial cache values and set routine
keys := make([]string, 0, m)
// bucketKeys is to demonstrate that splitted locks is working correctly
// by assigning one sequence of key for each bucket.
bucketKeys := make([][]string, opts.StripedBuckets)
for i := 0; i < m; i++ {
key := fmt.Sprintf("%d-key-%d", i, i)
keys = append(keys, key)
bucketKey := xxhash.Sum64String(key) % uint64(opts.StripedBuckets)
bucketKeys[bucketKey] = append(bucketKeys[bucketKey], key)
}
for i := 0; i < opts.Size; i++ {
cache.Set(keys[i], "preflight")
}
wgGet := &sync.WaitGroup{}
wgSet := &sync.WaitGroup{}
// need buffered chan because if the set routine finished before we write into the chan,
// we're left without any consumer, making any write to the chan waiting forever.
stopSet := make(chan bool, 1)
set := func() {
defer wgSet.Done()
for i := 0; i < m; i++ {
select {
case <-stopSet:
return
default:
_ = cache.Set(keys[i], "ignored")
}
}
}
get := func(bucket int) {
defer wgGet.Done()
var out string
for i := 0; i < m; i++ {
_ = cache.Get(bucketKeys[bucket][i%opts.Size], &out)
}
}
b.StopTimer()
b.ResetTimer()
for i := 0; i < b.N; i++ {
wgSet.Add(1)
go set()
for j := 0; j < opts.StripedBuckets; j++ {
wgGet.Add(1)
go get(j)
}
b.StartTimer()
wgGet.Wait()
b.StopTimer()
stopSet <- true
wgSet.Wait()
}
}