package diskv import ( "fmt" "math/rand" "testing" ) func shuffle(keys []string) { ints := rand.Perm(len(keys)) for i := range keys { keys[i], keys[ints[i]] = keys[ints[i]], keys[i] } } func genValue(size int) []byte { v := make([]byte, size) for i := 0; i < size; i++ { v[i] = uint8((rand.Int() % 26) + 97) // a-z } return v } const ( keyCount = 1000 ) func genKeys() []string { keys := make([]string, keyCount) for i := 0; i < keyCount; i++ { keys[i] = fmt.Sprintf("%d", i) } return keys } func (d *Diskv) load(keys []string, val []byte) { for _, key := range keys { d.Write(key, val) } } func benchRead(b *testing.B, size, cachesz int) { b.StopTimer() d := New(Options{ BasePath: "speed-test", Transform: func(string) []string { return []string{} }, CacheSizeMax: uint64(cachesz), }) defer d.EraseAll() keys := genKeys() value := genValue(size) d.load(keys, value) shuffle(keys) b.SetBytes(int64(size)) b.StartTimer() for i := 0; i < b.N; i++ { _, _ = d.Read(keys[i%len(keys)]) } b.StopTimer() } func benchWrite(b *testing.B, size int, withIndex bool) { b.StopTimer() options := Options{ BasePath: "speed-test", Transform: func(string) []string { return []string{} }, CacheSizeMax: 0, } if withIndex { options.Index = &BTreeIndex{} options.IndexLess = strLess } d := New(options) defer d.EraseAll() keys := genKeys() value := genValue(size) shuffle(keys) b.SetBytes(int64(size)) b.StartTimer() for i := 0; i < b.N; i++ { d.Write(keys[i%len(keys)], value) } b.StopTimer() } func BenchmarkWrite__32B_NoIndex(b *testing.B) { benchWrite(b, 32, false) } func BenchmarkWrite__1KB_NoIndex(b *testing.B) { benchWrite(b, 1024, false) } func BenchmarkWrite__4KB_NoIndex(b *testing.B) { benchWrite(b, 4096, false) } func BenchmarkWrite_10KB_NoIndex(b *testing.B) { benchWrite(b, 10240, false) } func BenchmarkWrite__32B_WithIndex(b *testing.B) { benchWrite(b, 32, true) } func BenchmarkWrite__1KB_WithIndex(b *testing.B) { benchWrite(b, 1024, true) } func BenchmarkWrite__4KB_WithIndex(b *testing.B) { benchWrite(b, 4096, true) } func BenchmarkWrite_10KB_WithIndex(b *testing.B) { benchWrite(b, 10240, true) } func BenchmarkRead__32B_NoCache(b *testing.B) { benchRead(b, 32, 0) } func BenchmarkRead__1KB_NoCache(b *testing.B) { benchRead(b, 1024, 0) } func BenchmarkRead__4KB_NoCache(b *testing.B) { benchRead(b, 4096, 0) } func BenchmarkRead_10KB_NoCache(b *testing.B) { benchRead(b, 10240, 0) } func BenchmarkRead__32B_WithCache(b *testing.B) { benchRead(b, 32, keyCount*32*2) } func BenchmarkRead__1KB_WithCache(b *testing.B) { benchRead(b, 1024, keyCount*1024*2) } func BenchmarkRead__4KB_WithCache(b *testing.B) { benchRead(b, 4096, keyCount*4096*2) } func BenchmarkRead_10KB_WithCache(b *testing.B) { benchRead(b, 10240, keyCount*4096*2) }