github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/core/interop/storage/bench_test.go (about) 1 package storage_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/nspcc-dev/neo-go/internal/random" 8 "github.com/nspcc-dev/neo-go/pkg/core/interop/iterator" 9 istorage "github.com/nspcc-dev/neo-go/pkg/core/interop/storage" 10 "github.com/nspcc-dev/neo-go/pkg/core/native" 11 "github.com/nspcc-dev/neo-go/pkg/core/state" 12 "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func BenchmarkStorageFind(b *testing.B) { 17 for count := 10; count <= 10000; count *= 10 { 18 b.Run(fmt.Sprintf("%dElements", count), func(b *testing.B) { 19 v, contractState, context, _ := createVMAndContractState(b) 20 require.NoError(b, native.PutContractState(context.DAO, contractState)) 21 22 items := make(map[string]state.StorageItem) 23 for i := 0; i < count; i++ { 24 items["abc"+random.String(10)] = random.Bytes(10) 25 } 26 for k, v := range items { 27 context.DAO.PutStorageItem(contractState.ID, []byte(k), v) 28 context.DAO.PutStorageItem(contractState.ID+1, []byte(k), v) 29 } 30 changes, err := context.DAO.Persist() 31 require.NoError(b, err) 32 require.NotEqual(b, 0, changes) 33 34 b.ResetTimer() 35 b.ReportAllocs() 36 for i := 0; i < b.N; i++ { 37 b.StopTimer() 38 v.Estack().PushVal(istorage.FindDefault) 39 v.Estack().PushVal("abc") 40 v.Estack().PushVal(stackitem.NewInterop(&istorage.Context{ID: contractState.ID})) 41 b.StartTimer() 42 err := istorage.Find(context) 43 if err != nil { 44 b.FailNow() 45 } 46 b.StopTimer() 47 context.Finalize() 48 } 49 }) 50 } 51 } 52 53 func BenchmarkStorageFindIteratorNext(b *testing.B) { 54 for count := 10; count <= 10000; count *= 10 { 55 cases := map[string]int{ 56 "Pick1": 1, 57 "PickHalf": count / 2, 58 "PickAll": count, 59 } 60 b.Run(fmt.Sprintf("%dElements", count), func(b *testing.B) { 61 for name, last := range cases { 62 b.Run(name, func(b *testing.B) { 63 v, contractState, context, _ := createVMAndContractState(b) 64 require.NoError(b, native.PutContractState(context.DAO, contractState)) 65 66 items := make(map[string]state.StorageItem) 67 for i := 0; i < count; i++ { 68 items["abc"+random.String(10)] = random.Bytes(10) 69 } 70 for k, v := range items { 71 context.DAO.PutStorageItem(contractState.ID, []byte(k), v) 72 context.DAO.PutStorageItem(contractState.ID+1, []byte(k), v) 73 } 74 changes, err := context.DAO.Persist() 75 require.NoError(b, err) 76 require.NotEqual(b, 0, changes) 77 b.ReportAllocs() 78 b.ResetTimer() 79 for i := 0; i < b.N; i++ { 80 b.StopTimer() 81 v.Estack().PushVal(istorage.FindDefault) 82 v.Estack().PushVal("abc") 83 v.Estack().PushVal(stackitem.NewInterop(&istorage.Context{ID: contractState.ID})) 84 b.StartTimer() 85 err := istorage.Find(context) 86 b.StopTimer() 87 if err != nil { 88 b.FailNow() 89 } 90 res := context.VM.Estack().Pop().Item() 91 for i := 0; i < last; i++ { 92 context.VM.Estack().PushVal(res) 93 b.StartTimer() 94 require.NoError(b, iterator.Next(context)) 95 b.StopTimer() 96 require.True(b, context.VM.Estack().Pop().Bool()) 97 } 98 99 context.VM.Estack().PushVal(res) 100 require.NoError(b, iterator.Next(context)) 101 actual := context.VM.Estack().Pop().Bool() 102 if last == count { 103 require.False(b, actual) 104 } else { 105 require.True(b, actual) 106 } 107 context.Finalize() 108 } 109 }) 110 } 111 }) 112 } 113 }