github.com/lazyledger/lazyledger-core@v0.35.0-dev.0.20210613111200-4c651f053571/state/txindex/kv/kv_bench_test.go (about)

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