-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbench_test.go
110 lines (100 loc) · 2.38 KB
/
bench_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package cdb
import (
"bytes"
"io/ioutil"
"launchpad.net/gommap"
"math/rand"
"os"
"testing"
)
var benchRecords []rec
var benchRecordsBytes []byte
var benchRecordsKeys [][]byte
func init() {
rng := rand.New(rand.NewSource(0))
for i := 0; i < 1000; i++ {
key := make([]byte, rng.Intn(30)+5)
val := make([]byte, rng.Intn(300)+10)
for j := 0; j < len(key); j++ {
key[j] = byte(rng.Int())
}
for j := 0; j < len(val); j++ {
val[j] = byte(rng.Uint32())
}
benchRecordsKeys = append(benchRecordsKeys, key)
benchRecords = append(benchRecords, rec{string(key), []string{string(val)}})
}
benchRecordsBytes = newDBBytes(benchRecords)
}
func BenchmarkMemBytes(b *testing.B) {
benchBytes(b, New(bytes.NewReader(benchRecordsBytes)))
}
func BenchmarkMemReader(b *testing.B) {
benchReader(b, New(bytes.NewReader(benchRecordsBytes)))
}
func BenchmarkDiskBytes(b *testing.B) {
file := createDBFile()
defer os.Remove(file.Name())
defer file.Close()
benchBytes(b, New(file))
}
func BenchmarkDiskReader(b *testing.B) {
file := createDBFile()
defer os.Remove(file.Name())
defer file.Close()
benchReader(b, New(file))
}
func BenchmarkMmapBytes(b *testing.B) {
file := createDBFile()
defer os.Remove(file.Name())
defer file.Close()
m, err := gommap.Map(file.Fd(), gommap.PROT_READ, gommap.MAP_SHARED)
if err != nil {
b.Fatal(err)
}
defer m.UnsafeUnmap()
benchBytes(b, New(bytes.NewReader(m)))
}
func BenchmarkMmapReader(b *testing.B) {
file := createDBFile()
defer os.Remove(file.Name())
defer file.Close()
m, err := gommap.Map(file.Fd(), gommap.PROT_READ, gommap.MAP_SHARED)
if err != nil {
b.Fatal(err)
}
defer m.UnsafeUnmap()
benchReader(b, New(bytes.NewReader(m)))
}
func benchBytes(b *testing.B, db *Cdb) {
rng := rand.New(rand.NewSource(0))
numKeys := len(benchRecordsKeys)
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _ = db.Bytes(benchRecordsKeys[rng.Intn(numKeys)])
}
}
func benchReader(b *testing.B, db *Cdb) {
rng := rand.New(rand.NewSource(0))
numKeys := len(benchRecordsKeys)
var buf bytes.Buffer
b.ResetTimer()
for i := 0; i < b.N; i++ {
r, _ := db.Reader(benchRecordsKeys[rng.Intn(numKeys)])
buf.Reset()
buf.ReadFrom(r)
}
}
func createDBFile() *os.File {
file, err := ioutil.TempFile("", "")
if err != nil {
panic(err)
}
_, err = file.Write(benchRecordsBytes)
if err != nil {
file.Close()
os.Remove(file.Name())
panic(err)
}
return file
}