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 }