forked from TrueCloudLab/xk6-frostfs
Evgenii Stratonikov
b66b5a2f37
It is the heaviest function executing on setup stage. The culprit is the linear dependency between its execution time and the amount of objects in registry. The solution is to store object by status. While the optimization doesn't work for objects with no status, it is currently provided by all scenarios. Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
107 lines
2 KiB
Go
107 lines
2 KiB
Go
package registry
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math/rand"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/io"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func BenchmarkObjectInfoMarshal(b *testing.B) {
|
|
obj := randomObjectInfo()
|
|
b.Run("json", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_, err := json.Marshal(obj)
|
|
if err != nil {
|
|
b.FailNow()
|
|
}
|
|
}
|
|
})
|
|
b.Run("native", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_, err := obj.Marshal()
|
|
if err != nil {
|
|
b.FailNow()
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func BenchmarkObjectInfoUnmarshal(b *testing.B) {
|
|
obj := randomObjectInfo()
|
|
|
|
b.Run("json", func(b *testing.B) {
|
|
data, err := json.Marshal(obj)
|
|
require.NoError(b, err)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
var obj ObjectInfo
|
|
err := json.Unmarshal(data, &obj)
|
|
if err != nil {
|
|
b.FailNow()
|
|
}
|
|
}
|
|
})
|
|
b.Run("native", func(b *testing.B) {
|
|
data, err := obj.Marshal()
|
|
require.NoError(b, err)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
err := obj.Unmarshal(data)
|
|
if err != nil {
|
|
b.FailNow()
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestObjectInfoMarshal(t *testing.T) {
|
|
expected := randomObjectInfo()
|
|
|
|
data, err := expected.Marshal()
|
|
require.NoError(t, err)
|
|
|
|
var actual ObjectInfo
|
|
require.NoError(t, actual.Unmarshal(data))
|
|
require.Equal(t, expected, actual)
|
|
}
|
|
|
|
func TestObjectInfoEncodeBinary(t *testing.T) {
|
|
expected := randomObjectInfo()
|
|
|
|
w := io.NewBufBinWriter()
|
|
expected.EncodeBinary(w.BinWriter)
|
|
require.NoError(t, w.Err)
|
|
|
|
data := w.Bytes()
|
|
r := io.NewBinReaderFromBuf(data)
|
|
|
|
var actual ObjectInfo
|
|
actual.DecodeBinary(r)
|
|
require.NoError(t, r.Err)
|
|
require.Equal(t, expected, actual)
|
|
}
|
|
|
|
func randomObjectInfo() ObjectInfo {
|
|
return ObjectInfo{
|
|
CreatedAt: int64(rand.Uint64()),
|
|
Status: statusCreated,
|
|
Id: rand.Uint64(),
|
|
CID: randString(32),
|
|
OID: randString(32),
|
|
S3Bucket: randString(32),
|
|
S3Key: randString(32),
|
|
PayloadHash: randString(64),
|
|
}
|
|
}
|
|
|
|
func randString(n int) string {
|
|
var sb strings.Builder
|
|
for i := 0; i < n; i++ {
|
|
sb.WriteRune('a' + rune(rand.Int())%('z'-'a'+1))
|
|
}
|
|
return sb.String()
|
|
}
|