github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/storage/memdb_bench_test.go (about)

     1  // Copyright 2022 zGraph Authors. All rights reserved.
     2  //
     3  // Copyright 2020 PingCAP, Inc.
     4  //
     5  // Licensed under the Apache License, Version 2.0 (the "License");
     6  // you may not use this file except in compliance with the License.
     7  // You may obtain a copy of the License at
     8  //
     9  //     http://www.apache.org/licenses/LICENSE-2.0
    10  //
    11  // Unless required by applicable law or agreed to in writing, software
    12  // distributed under the License is distributed on an "AS IS" BASIS,
    13  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14  // See the License for the specific language governing permissions and
    15  // limitations under the License.
    16  
    17  package storage
    18  
    19  import (
    20  	"context"
    21  	"encoding/binary"
    22  	"math/rand"
    23  	"testing"
    24  )
    25  
    26  const (
    27  	keySize   = 16
    28  	valueSize = 128
    29  )
    30  
    31  func BenchmarkLargeIndex(b *testing.B) {
    32  	buf := make([][valueSize]byte, 10000000)
    33  	for i := range buf {
    34  		binary.LittleEndian.PutUint32(buf[i][:], uint32(i))
    35  	}
    36  	db := newMemDB()
    37  	b.ResetTimer()
    38  
    39  	for i := range buf {
    40  		db.Set(buf[i][:keySize], buf[i][:])
    41  	}
    42  }
    43  
    44  func BenchmarkPut(b *testing.B) {
    45  	buf := make([][valueSize]byte, b.N)
    46  	for i := range buf {
    47  		binary.BigEndian.PutUint32(buf[i][:], uint32(i))
    48  	}
    49  
    50  	p := newMemDB()
    51  	b.ResetTimer()
    52  
    53  	for i := range buf {
    54  		p.Set(buf[i][:keySize], buf[i][:])
    55  	}
    56  }
    57  
    58  func BenchmarkPutRandom(b *testing.B) {
    59  	buf := make([][valueSize]byte, b.N)
    60  	for i := range buf {
    61  		binary.LittleEndian.PutUint32(buf[i][:], uint32(rand.Int()))
    62  	}
    63  
    64  	p := newMemDB()
    65  	b.ResetTimer()
    66  
    67  	for i := range buf {
    68  		p.Set(buf[i][:keySize], buf[i][:])
    69  	}
    70  }
    71  
    72  func BenchmarkGet(b *testing.B) {
    73  	buf := make([][valueSize]byte, b.N)
    74  	for i := range buf {
    75  		binary.BigEndian.PutUint32(buf[i][:], uint32(i))
    76  	}
    77  
    78  	p := newMemDB()
    79  	for i := range buf {
    80  		p.Set(buf[i][:keySize], buf[i][:])
    81  	}
    82  
    83  	b.ResetTimer()
    84  	for i := range buf {
    85  		p.Get(context.Background(), buf[i][:keySize])
    86  	}
    87  }
    88  
    89  func BenchmarkGetRandom(b *testing.B) {
    90  	buf := make([][valueSize]byte, b.N)
    91  	for i := range buf {
    92  		binary.LittleEndian.PutUint32(buf[i][:], uint32(rand.Int()))
    93  	}
    94  
    95  	p := newMemDB()
    96  	for i := range buf {
    97  		p.Set(buf[i][:keySize], buf[i][:])
    98  	}
    99  
   100  	b.ResetTimer()
   101  	for i := 0; i < b.N; i++ {
   102  		p.Get(context.Background(), buf[i][:keySize])
   103  	}
   104  }
   105  
   106  var opCnt = 100000
   107  
   108  func BenchmarkMemDbBufferSequential(b *testing.B) {
   109  	data := make([][]byte, opCnt)
   110  	for i := 0; i < opCnt; i++ {
   111  		data[i] = encodeInt(i)
   112  	}
   113  	buffer := newMemDB()
   114  	benchmarkSetGet(b, buffer, data)
   115  	b.ReportAllocs()
   116  }
   117  
   118  func BenchmarkMemDbBufferRandom(b *testing.B) {
   119  	data := make([][]byte, opCnt)
   120  	for i := 0; i < opCnt; i++ {
   121  		data[i] = encodeInt(i)
   122  	}
   123  	shuffle(data)
   124  	buffer := newMemDB()
   125  	benchmarkSetGet(b, buffer, data)
   126  	b.ReportAllocs()
   127  }
   128  
   129  func BenchmarkMemDbIter(b *testing.B) {
   130  	buffer := newMemDB()
   131  	benchIterator(b, buffer)
   132  	b.ReportAllocs()
   133  }
   134  
   135  func BenchmarkMemDbCreation(b *testing.B) {
   136  	for i := 0; i < b.N; i++ {
   137  		newMemDB()
   138  	}
   139  	b.ReportAllocs()
   140  }
   141  
   142  func shuffle(slc [][]byte) {
   143  	N := len(slc)
   144  	for i := 0; i < N; i++ {
   145  		// choose index uniformly in [i, N-1]
   146  		r := i + rand.Intn(N-i)
   147  		slc[r], slc[i] = slc[i], slc[r]
   148  	}
   149  }
   150  func benchmarkSetGet(b *testing.B, buffer *MemDB, data [][]byte) {
   151  	b.ResetTimer()
   152  	for i := 0; i < b.N; i++ {
   153  		for _, k := range data {
   154  			buffer.Set(k, k)
   155  		}
   156  		for _, k := range data {
   157  			buffer.Get(context.Background(), k)
   158  		}
   159  	}
   160  }
   161  
   162  func benchIterator(b *testing.B, buffer *MemDB) {
   163  	for k := 0; k < opCnt; k++ {
   164  		buffer.Set(encodeInt(k), encodeInt(k))
   165  	}
   166  	b.ResetTimer()
   167  	for i := 0; i < b.N; i++ {
   168  		iter, err := buffer.Iter(nil, nil)
   169  		if err != nil {
   170  			b.Error(err)
   171  		}
   172  		for iter.Valid() {
   173  			iter.Next()
   174  		}
   175  		iter.Close()
   176  	}
   177  }