[#1516] metabase: Add benchmark for ListWithCursor

```
name                        time/op
ListWithCursor/1_item-8     10.6µs ± 1%
ListWithCursor/10_items-8   75.3µs ± 2%
ListWithCursor/100_items-8   726µs ± 2%

name                        alloc/op
ListWithCursor/1_item-8     3.19kB ± 0%
ListWithCursor/10_items-8   20.7kB ± 0%
ListWithCursor/100_items-8   196kB ± 0%

name                        allocs/op
ListWithCursor/1_item-8       55.0 ± 0%
ListWithCursor/10_items-8      346 ± 0%
ListWithCursor/100_items-8   3.25k ± 0%
```

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgenii Stratonikov 2022-06-14 18:21:29 +03:00 committed by LeL
parent 36f4929e52
commit 504f45e9ee

View file

@ -10,9 +10,61 @@ import (
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
objectSDK "github.com/nspcc-dev/neofs-sdk-go/object"
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
"github.com/stretchr/testify/require"
"go.etcd.io/bbolt"
)
func BenchmarkListWithCursor(b *testing.B) {
db := listWithCursorPrepareDB(b)
b.Run("1 item", func(b *testing.B) {
benchmarkListWithCursor(b, db, 1)
})
b.Run("10 items", func(b *testing.B) {
benchmarkListWithCursor(b, db, 10)
})
b.Run("100 items", func(b *testing.B) {
benchmarkListWithCursor(b, db, 100)
})
}
func listWithCursorPrepareDB(b *testing.B) *meta.DB {
db := newDB(b, meta.WithBatchSize(1), meta.WithBoltDBOptions(&bbolt.Options{
NoSync: true,
})) // faster single-thread generation
obj := generateObject(b)
for i := 0; i < 100_000; i++ { // should be a multiple of all batch sizes
obj.SetID(oidtest.ID())
if i%9 == 0 { // let's have 9 objects per container
obj.SetContainerID(cidtest.ID())
}
require.NoError(b, putBig(db, obj))
}
return db
}
func benchmarkListWithCursor(b *testing.B, db *meta.DB, batchSize int) {
var prm meta.ListPrm
prm.WithCount(uint32(batchSize))
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
res, err := db.ListWithCursor(prm)
if err != nil {
if err != meta.ErrEndOfListing {
b.Fatalf("error: %v", err)
}
prm.WithCursor(nil)
} else if ln := len(res.AddressList()); ln != batchSize {
b.Fatalf("invalid batch size: %d", ln)
} else {
prm.WithCursor(res.Cursor())
}
}
}
func TestLisObjectsWithCursor(t *testing.T) {
db := newDB(t)