1 package diskv
2
3 import (
4 "fmt"
5 "math/rand"
6 "testing"
7 )
8
9 func shuffle(keys []string) {
10 ints := rand.Perm(len(keys))
11 for i := range keys {
12 keys[i], keys[ints[i]] = keys[ints[i]], keys[i]
13 }
14 }
15
16 func genValue(size int) []byte {
17 v := make([]byte, size)
18 for i := 0; i < size; i++ {
19 v[i] = uint8((rand.Int() % 26) + 97)
20 }
21 return v
22 }
23
24 const (
25 keyCount = 1000
26 )
27
28 func genKeys() []string {
29 keys := make([]string, keyCount)
30 for i := 0; i < keyCount; i++ {
31 keys[i] = fmt.Sprintf("%d", i)
32 }
33 return keys
34 }
35
36 func (d *Diskv) load(keys []string, val []byte) {
37 for _, key := range keys {
38 d.Write(key, val)
39 }
40 }
41
42 func benchRead(b *testing.B, size, cachesz int) {
43 b.StopTimer()
44 d := New(Options{
45 BasePath: "speed-test",
46 CacheSizeMax: uint64(cachesz),
47 })
48 defer d.EraseAll()
49
50 keys := genKeys()
51 value := genValue(size)
52 d.load(keys, value)
53 shuffle(keys)
54 b.SetBytes(int64(size))
55
56 b.StartTimer()
57 for i := 0; i < b.N; i++ {
58 _, _ = d.Read(keys[i%len(keys)])
59 }
60 b.StopTimer()
61 }
62
63 func benchWrite(b *testing.B, size int, withIndex bool) {
64 b.StopTimer()
65
66 options := Options{
67 BasePath: "speed-test",
68 CacheSizeMax: 0,
69 }
70 if withIndex {
71 options.Index = &BTreeIndex{}
72 options.IndexLess = strLess
73 }
74
75 d := New(options)
76 defer d.EraseAll()
77 keys := genKeys()
78 value := genValue(size)
79 shuffle(keys)
80 b.SetBytes(int64(size))
81
82 b.StartTimer()
83 for i := 0; i < b.N; i++ {
84 d.Write(keys[i%len(keys)], value)
85 }
86 b.StopTimer()
87 }
88
89 func BenchmarkWrite__32B_NoIndex(b *testing.B) {
90 benchWrite(b, 32, false)
91 }
92
93 func BenchmarkWrite__1KB_NoIndex(b *testing.B) {
94 benchWrite(b, 1024, false)
95 }
96
97 func BenchmarkWrite__4KB_NoIndex(b *testing.B) {
98 benchWrite(b, 4096, false)
99 }
100
101 func BenchmarkWrite_10KB_NoIndex(b *testing.B) {
102 benchWrite(b, 10240, false)
103 }
104
105 func BenchmarkWrite__32B_WithIndex(b *testing.B) {
106 benchWrite(b, 32, true)
107 }
108
109 func BenchmarkWrite__1KB_WithIndex(b *testing.B) {
110 benchWrite(b, 1024, true)
111 }
112
113 func BenchmarkWrite__4KB_WithIndex(b *testing.B) {
114 benchWrite(b, 4096, true)
115 }
116
117 func BenchmarkWrite_10KB_WithIndex(b *testing.B) {
118 benchWrite(b, 10240, true)
119 }
120
121 func BenchmarkRead__32B_NoCache(b *testing.B) {
122 benchRead(b, 32, 0)
123 }
124
125 func BenchmarkRead__1KB_NoCache(b *testing.B) {
126 benchRead(b, 1024, 0)
127 }
128
129 func BenchmarkRead__4KB_NoCache(b *testing.B) {
130 benchRead(b, 4096, 0)
131 }
132
133 func BenchmarkRead_10KB_NoCache(b *testing.B) {
134 benchRead(b, 10240, 0)
135 }
136
137 func BenchmarkRead__32B_WithCache(b *testing.B) {
138 benchRead(b, 32, keyCount*32*2)
139 }
140
141 func BenchmarkRead__1KB_WithCache(b *testing.B) {
142 benchRead(b, 1024, keyCount*1024*2)
143 }
144
145 func BenchmarkRead__4KB_WithCache(b *testing.B) {
146 benchRead(b, 4096, keyCount*4096*2)
147 }
148
149 func BenchmarkRead_10KB_WithCache(b *testing.B) {
150 benchRead(b, 10240, keyCount*4096*2)
151 }
152
View as plain text