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 }