mirror of
https://github.com/taigrr/bitcask
synced 2025-01-18 04:03:17 -08:00
Improved benchmark test suite for various key/value sizes
This commit is contained in:
parent
3b9627aeb8
commit
71a42800fe
24
README.md
24
README.md
@ -97,13 +97,33 @@ Benchmarks run on a 11" Macbook with a 1.4Ghz Intel Core i7:
|
|||||||
```
|
```
|
||||||
$ make bench
|
$ make bench
|
||||||
...
|
...
|
||||||
BenchmarkGet-4 300000 5065 ns/op 144 B/op 4 allocs/op
|
BenchmarkGet/128B-4 200000 5780 ns/op 400 B/op 5 allocs/op
|
||||||
BenchmarkPut-4 100000 14640 ns/op 699 B/op 7 allocs/op
|
BenchmarkGet/256B-4 200000 6138 ns/op 656 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/512B-4 200000 5967 ns/op 1200 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/1K-4 200000 6290 ns/op 2288 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/2K-4 200000 6293 ns/op 4464 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/4K-4 200000 7673 ns/op 9072 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/8K-4 200000 10373 ns/op 17776 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/16K-4 100000 14227 ns/op 34928 B/op 5 allocs/op
|
||||||
|
BenchmarkGet/32K-4 100000 25953 ns/op 73840 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/128B-4 100000 17353 ns/op 680 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/256B-4 100000 18620 ns/op 808 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/512B-4 100000 19068 ns/op 1096 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/1K-4 100000 23738 ns/op 1673 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/2K-4 50000 25118 ns/op 2826 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/4K-4 50000 44605 ns/op 5389 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/8K-4 30000 55237 ns/op 10001 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/16K-4 20000 78966 ns/op 18972 B/op 5 allocs/op
|
||||||
|
BenchmarkPut/32K-4 10000 116253 ns/op 41520 B/op 5 allocs/op
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For 128B values:
|
||||||
|
|
||||||
* ~180,000 reads/sec
|
* ~180,000 reads/sec
|
||||||
* ~60,000 writes/sec
|
* ~60,000 writes/sec
|
||||||
|
|
||||||
|
The full benchmark above shows linear performance as you increase key/value sizes.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
bitcask is licensed under the [MIT License](https://github.com/prologic/bitcask/blob/master/LICENSE)
|
bitcask is licensed under the [MIT License](https://github.com/prologic/bitcask/blob/master/LICENSE)
|
||||||
|
@ -294,6 +294,11 @@ func TestLocking(t *testing.T) {
|
|||||||
assert.Equal("error: cannot acquire lock", err.Error())
|
assert.Equal("error: cannot acquire lock", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type benchmarkTestCase struct {
|
||||||
|
name string
|
||||||
|
size int
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkGet(b *testing.B) {
|
func BenchmarkGet(b *testing.B) {
|
||||||
testdir, err := ioutil.TempDir("", "bitcask")
|
testdir, err := ioutil.TempDir("", "bitcask")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -306,21 +311,40 @@ func BenchmarkGet(b *testing.B) {
|
|||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
err = db.Put("foo", []byte("bar"))
|
tests := []benchmarkTestCase{
|
||||||
|
{"128B", 128},
|
||||||
|
{"256B", 256},
|
||||||
|
{"512B", 512},
|
||||||
|
{"1K", 1024},
|
||||||
|
{"2K", 2048},
|
||||||
|
{"4K", 4096},
|
||||||
|
{"8K", 8192},
|
||||||
|
{"16K", 16384},
|
||||||
|
{"32K", 32768},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
b.Run(tt.name, func(b *testing.B) {
|
||||||
|
key := "foo"
|
||||||
|
value := []byte(strings.Repeat(" ", tt.size))
|
||||||
|
|
||||||
|
err = db.Put(key, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Fatal(err)
|
b.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
val, err := db.Get("foo")
|
val, err := db.Get(key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Fatal(err)
|
b.Fatal(err)
|
||||||
}
|
}
|
||||||
if string(val) != "bar" {
|
if string(val) != string(value) {
|
||||||
b.Errorf("expected val=bar got=%s", val)
|
b.Errorf("unexpected value")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkPut(b *testing.B) {
|
func BenchmarkPut(b *testing.B) {
|
||||||
@ -335,11 +359,29 @@ func BenchmarkPut(b *testing.B) {
|
|||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
|
tests := []benchmarkTestCase{
|
||||||
|
{"128B", 128},
|
||||||
|
{"256B", 256},
|
||||||
|
{"512B", 512},
|
||||||
|
{"1K", 1024},
|
||||||
|
{"2K", 2048},
|
||||||
|
{"4K", 4096},
|
||||||
|
{"8K", 8192},
|
||||||
|
{"16K", 16384},
|
||||||
|
{"32K", 32768},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
b.Run(tt.name, func(b *testing.B) {
|
||||||
|
key := "foo"
|
||||||
|
value := []byte(strings.Repeat(" ", tt.size))
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
err := db.Put(fmt.Sprintf("key%d", i), []byte("bar"))
|
err := db.Put(key, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
b.Fatal(err)
|
b.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user