github.com/scottcagno/storage@v1.8.0/pkg/lsmt/lsmtree_bench_test.go (about)

     1  package lsmt
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/scottcagno/storage/pkg/lsmt/sstable"
     6  	"os"
     7  	"testing"
     8  )
     9  
    10  func _makeKey(i int) string {
    11  	return fmt.Sprintf("key-%06d", i)
    12  }
    13  
    14  func _makeVal(i int) []byte {
    15  	return []byte(fmt.Sprintf("value-%08d", i))
    16  }
    17  
    18  func lsmTreeWrite(b *testing.B, db *LSMTree, count int) {
    19  
    20  	// write Entries
    21  	for i := 0; i < count; i++ {
    22  		err := db.Put(makeKey(i), makeVal(i))
    23  		if err != nil {
    24  			b.Errorf("put: %v\n", err)
    25  		}
    26  	}
    27  }
    28  
    29  func lsmTreeRead(b *testing.B, db *LSMTree, count int) {
    30  
    31  	// used to "catch" value
    32  	var vv interface{}
    33  
    34  	// read Entries
    35  	for i := 0; i < count; i++ {
    36  		v, err := db.Get(makeKey(i))
    37  		if err != nil {
    38  			if err == sstable.ErrSSTIndexNotFound {
    39  				continue
    40  			}
    41  			b.Errorf("get: %v\n", err)
    42  		}
    43  		vv = v
    44  		_ = vv
    45  	}
    46  }
    47  
    48  func lsmTreeRemove(b *testing.B, db *LSMTree, count int) {
    49  
    50  	// remove Entries
    51  	for i := 0; i < count; i++ {
    52  		err := db.Del(makeKey(i))
    53  		if err != nil {
    54  			b.Errorf("del: %v\n", err)
    55  		}
    56  	}
    57  }
    58  
    59  func setup(b *testing.B) *LSMTree {
    60  
    61  	// open
    62  	db, err := OpenLSMTree(conf)
    63  	if err != nil {
    64  		b.Errorf("open: %v\n", err)
    65  	}
    66  
    67  	// return db
    68  	return db
    69  }
    70  
    71  func teardown(b *testing.B, db *LSMTree, shouldClean bool) {
    72  
    73  	// close
    74  	err := db.Close()
    75  	if err != nil {
    76  		b.Errorf("close: %v\n", err)
    77  	}
    78  
    79  	// check cleanup
    80  	if shouldClean {
    81  		err = os.RemoveAll(db.conf.BaseDir)
    82  		if err != nil {
    83  			b.Fatalf("got error: %v\n", err)
    84  		}
    85  	}
    86  }
    87  
    88  func Bench_LSMTree_Write(b *testing.B, db *LSMTree, count int) {
    89  
    90  	// reset measurements
    91  	reset(b)
    92  
    93  	// test write
    94  	for i := 0; i < b.N; i++ {
    95  		b.Run("lsmTreeWrite", func(b *testing.B) {
    96  			lsmTreeWrite(b, db, count)
    97  		})
    98  	}
    99  }
   100  
   101  func Bench_LSMTree_Read(b *testing.B, db *LSMTree, count int) {
   102  
   103  	// reset measurements
   104  	reset(b)
   105  
   106  	// test read
   107  	for i := 0; i < b.N; i++ {
   108  		b.Run("lsmTreeRead", func(b *testing.B) {
   109  			lsmTreeRead(b, db, count)
   110  		})
   111  	}
   112  }
   113  
   114  func BenchmarkLSMTree(b *testing.B) {
   115  
   116  	// count
   117  	count := 10
   118  
   119  	// setup (OPEN DB)
   120  	db := setup(b)
   121  
   122  	// writing
   123  	Bench_LSMTree_Write(b, db, count)
   124  
   125  	// reading
   126  	Bench_LSMTree_Read(b, db, count)
   127  
   128  	// teardown (CLOSE DB)
   129  	teardown(b, db, false)
   130  }
   131  
   132  func reset(b *testing.B) {
   133  	b.ResetTimer()
   134  	b.ReportAllocs()
   135  }