You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.5 KiB

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