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  }