github.com/vipernet-xyz/tm@v0.34.24/state/txindex/kv/kv_bench_test.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"crypto/rand"
     6  	"fmt"
     7  	"os"
     8  	"testing"
     9  
    10  	dbm "github.com/tendermint/tm-db"
    11  
    12  	abci "github.com/vipernet-xyz/tm/abci/types"
    13  	"github.com/vipernet-xyz/tm/libs/pubsub/query"
    14  	"github.com/vipernet-xyz/tm/types"
    15  )
    16  
    17  func BenchmarkTxSearch(b *testing.B) {
    18  	dbDir, err := os.MkdirTemp("", "benchmark_tx_search_test")
    19  	if err != nil {
    20  		b.Errorf("failed to create temporary directory: %s", err)
    21  	}
    22  
    23  	db, err := dbm.NewGoLevelDB("benchmark_tx_search_test", dbDir)
    24  	if err != nil {
    25  		b.Errorf("failed to create database: %s", err)
    26  	}
    27  
    28  	indexer := NewTxIndex(db)
    29  
    30  	for i := 0; i < 35000; i++ {
    31  		events := []abci.Event{
    32  			{
    33  				Type: "transfer",
    34  				Attributes: []abci.EventAttribute{
    35  					{Key: []byte("address"), Value: []byte(fmt.Sprintf("address_%d", i%100)), Index: true},
    36  					{Key: []byte("amount"), Value: []byte("50"), Index: true},
    37  				},
    38  			},
    39  		}
    40  
    41  		txBz := make([]byte, 8)
    42  		if _, err := rand.Read(txBz); err != nil {
    43  			b.Errorf("failed produce random bytes: %s", err)
    44  		}
    45  
    46  		txResult := &abci.TxResult{
    47  			Height: int64(i),
    48  			Index:  0,
    49  			Tx:     types.Tx(string(txBz)),
    50  			Result: abci.ResponseDeliverTx{
    51  				Data:   []byte{0},
    52  				Code:   abci.CodeTypeOK,
    53  				Log:    "",
    54  				Events: events,
    55  			},
    56  		}
    57  
    58  		if err := indexer.Index(txResult); err != nil {
    59  			b.Errorf("failed to index tx: %s", err)
    60  		}
    61  	}
    62  
    63  	txQuery := query.MustParse("transfer.address = 'address_43' AND transfer.amount = 50")
    64  
    65  	b.ResetTimer()
    66  
    67  	ctx := context.Background()
    68  
    69  	for i := 0; i < b.N; i++ {
    70  		if _, err := indexer.Search(ctx, txQuery); err != nil {
    71  			b.Errorf("failed to query for txs: %s", err)
    72  		}
    73  	}
    74  }