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