You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.9 KiB
67 lines
1.9 KiB
package cache_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
glru "github.com/hashicorp/golang-lru"
|
|
"github.com/stretchr/testify/require"
|
|
"gitoa.ru/go-4devs/cache"
|
|
"gitoa.ru/go-4devs/cache/provider/lru"
|
|
"gitoa.ru/go-4devs/cache/provider/memcache"
|
|
"gitoa.ru/go-4devs/cache/provider/memory"
|
|
"gitoa.ru/go-4devs/cache/provider/pebble"
|
|
"gitoa.ru/go-4devs/cache/provider/redis"
|
|
"gitoa.ru/go-4devs/cache/provider/ristretto"
|
|
"gitoa.ru/go-4devs/cache/test"
|
|
"gitoa.ru/go-4devs/encoding/gob"
|
|
)
|
|
|
|
type cacheBench struct {
|
|
name string
|
|
cache *cache.Cache
|
|
}
|
|
|
|
func cacheBenchList() []cacheBench {
|
|
client, _ := glru.New(10000)
|
|
db, cl := test.PebbleDB()
|
|
|
|
defer cl()
|
|
|
|
return []cacheBench{
|
|
{"encoding json", cache.New(memory.NewEncoding())},
|
|
{"encoding gob", cache.New(memory.NewEncoding(), cache.WithDataOption(cache.WithMarshal(gob.Unmarshal, gob.Marshal)))},
|
|
{"map", cache.New(memory.NewMap())},
|
|
{"map shards", cache.New(memory.NewMapShard())},
|
|
{"ristretto", cache.New(ristretto.New(test.RistrettoClient()))},
|
|
{"lru", cache.New(lru.New(client))},
|
|
{"redis json", cache.New(redis.New(test.RedisClient()))},
|
|
{"redis gob", cache.New(redis.New(test.RedisClient()), cache.WithDataOption(cache.WithMarshal(gob.Unmarshal, gob.Marshal)))},
|
|
{"memcache json", cache.New(memcache.New(test.MemcacheClient()))},
|
|
{"memcache gob", cache.New(memcache.New(test.MemcacheClient()), cache.WithDataOption(cache.WithMarshal(gob.Unmarshal, gob.Marshal)))},
|
|
{"pebble json", cache.New(pebble.New(db))},
|
|
}
|
|
}
|
|
|
|
type testStruct struct {
|
|
Key string
|
|
Val string
|
|
}
|
|
|
|
func BenchmarkCacheGetStruct(b *testing.B) {
|
|
ctx := context.Background()
|
|
|
|
var val testStruct
|
|
|
|
for _, c := range cacheBenchList() {
|
|
current := c.cache
|
|
require.Nil(b, current.Set(ctx, "key", testStruct{"key", c.name}, cache.WithTTL(time.Minute)))
|
|
|
|
b.Run(c.name, func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_ = current.Get(ctx, "key", &val)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|