github.com/ava-labs/avalanchego@v1.11.11/vms/avm/vm_benchmark_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package avm
     5  
     6  import (
     7  	"fmt"
     8  	"math/rand"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/ava-labs/avalanchego/ids"
    14  	"github.com/ava-labs/avalanchego/upgrade/upgradetest"
    15  	"github.com/ava-labs/avalanchego/utils/set"
    16  	"github.com/ava-labs/avalanchego/vms/components/avax"
    17  	"github.com/ava-labs/avalanchego/vms/components/keystore"
    18  	"github.com/ava-labs/avalanchego/vms/secp256k1fx"
    19  )
    20  
    21  func BenchmarkLoadUser(b *testing.B) {
    22  	runLoadUserBenchmark := func(b *testing.B, numKeys int) {
    23  		require := require.New(b)
    24  
    25  		env := setup(b, &envConfig{
    26  			fork: upgradetest.Latest,
    27  			keystoreUsers: []*user{{
    28  				username: username,
    29  				password: password,
    30  			}},
    31  		})
    32  		defer env.vm.ctx.Lock.Unlock()
    33  
    34  		user, err := keystore.NewUserFromKeystore(env.vm.ctx.Keystore, username, password)
    35  		require.NoError(err)
    36  
    37  		keys, err := keystore.NewKeys(user, numKeys)
    38  		require.NoError(err)
    39  
    40  		b.ResetTimer()
    41  
    42  		fromAddrs := set.Set[ids.ShortID]{}
    43  		for n := 0; n < b.N; n++ {
    44  			addrIndex := n % numKeys
    45  			fromAddrs.Clear()
    46  			fromAddrs.Add(keys[addrIndex].PublicKey().Address())
    47  			_, _, err := env.vm.LoadUser(username, password, fromAddrs)
    48  			require.NoError(err)
    49  		}
    50  
    51  		b.StopTimer()
    52  
    53  		require.NoError(user.Close())
    54  	}
    55  
    56  	benchmarkSize := []int{10, 100, 1000, 5000}
    57  	for _, numKeys := range benchmarkSize {
    58  		b.Run(fmt.Sprintf("NumKeys=%d", numKeys), func(b *testing.B) {
    59  			runLoadUserBenchmark(b, numKeys)
    60  		})
    61  	}
    62  }
    63  
    64  // getAllUTXOsBenchmark is a helper func to benchmark the GetAllUTXOs depending on the size
    65  func getAllUTXOsBenchmark(b *testing.B, utxoCount int, randSrc rand.Source) {
    66  	require := require.New(b)
    67  
    68  	env := setup(b, &envConfig{fork: upgradetest.Latest})
    69  	defer env.vm.ctx.Lock.Unlock()
    70  
    71  	addr := ids.GenerateTestShortID()
    72  
    73  	for i := 0; i < utxoCount; i++ {
    74  		utxo := &avax.UTXO{
    75  			UTXOID: avax.UTXOID{
    76  				TxID:        ids.GenerateTestID(),
    77  				OutputIndex: uint32(randSrc.Int63()),
    78  			},
    79  			Asset: avax.Asset{ID: env.vm.ctx.AVAXAssetID},
    80  			Out: &secp256k1fx.TransferOutput{
    81  				Amt: 100000,
    82  				OutputOwners: secp256k1fx.OutputOwners{
    83  					Locktime:  0,
    84  					Addrs:     []ids.ShortID{addr},
    85  					Threshold: 1,
    86  				},
    87  			},
    88  		}
    89  
    90  		env.vm.state.AddUTXO(utxo)
    91  	}
    92  	require.NoError(env.vm.state.Commit())
    93  
    94  	addrsSet := set.Of(addr)
    95  
    96  	b.ResetTimer()
    97  
    98  	for i := 0; i < b.N; i++ {
    99  		// Fetch all UTXOs older version
   100  		notPaginatedUTXOs, err := avax.GetAllUTXOs(env.vm.state, addrsSet)
   101  		require.NoError(err)
   102  		require.Len(notPaginatedUTXOs, utxoCount)
   103  	}
   104  }
   105  
   106  func BenchmarkGetUTXOs(b *testing.B) {
   107  	tests := []struct {
   108  		name      string
   109  		utxoCount int
   110  	}{
   111  		{
   112  			name:      "100",
   113  			utxoCount: 100,
   114  		},
   115  		{
   116  			name:      "10k",
   117  			utxoCount: 10_000,
   118  		},
   119  		{
   120  			name:      "100k",
   121  			utxoCount: 100_000,
   122  		},
   123  	}
   124  
   125  	for testIdx, count := range tests {
   126  		randSrc := rand.NewSource(int64(testIdx))
   127  		b.Run(count.name, func(b *testing.B) {
   128  			getAllUTXOsBenchmark(b, count.utxoCount, randSrc)
   129  		})
   130  	}
   131  }