github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/internal/state/indexer/tx/kv/kv_bench_test.go (about)

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