mirror of
https://github.com/gogrlx/bitcask.git
synced 2026-04-02 02:58:59 -07:00
Improve Get/Put performance with optional mempooling (#36)
* avoid unnecessary use of encoder/decoder to decrease memory allocations * add an optional configurable mempool to avoid extra allocs * add doc.go with examples
This commit is contained in:
committed by
James Mills
parent
6ceeccfd64
commit
a407905ae2
@@ -468,8 +468,9 @@ func TestLocking(t *testing.T) {
|
||||
}
|
||||
|
||||
type benchmarkTestCase struct {
|
||||
name string
|
||||
size int
|
||||
name string
|
||||
size int
|
||||
withPool bool
|
||||
}
|
||||
|
||||
func BenchmarkGet(b *testing.B) {
|
||||
@@ -484,22 +485,25 @@ func BenchmarkGet(b *testing.B) {
|
||||
}
|
||||
defer os.RemoveAll(testdir)
|
||||
|
||||
db, err := Open(testdir)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
tests := []benchmarkTestCase{
|
||||
{"128B", 128},
|
||||
{"256B", 256},
|
||||
{"512B", 512},
|
||||
{"1K", 1024},
|
||||
{"2K", 2048},
|
||||
{"4K", 4096},
|
||||
{"8K", 8192},
|
||||
{"16K", 16384},
|
||||
{"32K", 32768},
|
||||
{"128B", 128, false},
|
||||
{"128BWithPool", 128, true},
|
||||
{"256B", 256, false},
|
||||
{"256BWithPool", 256, true},
|
||||
{"512B", 512, false},
|
||||
{"512BWithPool", 512, true},
|
||||
{"1K", 1024, false},
|
||||
{"1KWithPool", 1024, true},
|
||||
{"2K", 2048, false},
|
||||
{"2KWithPool", 2048, true},
|
||||
{"4K", 4096, false},
|
||||
{"4KWithPool", 4096, true},
|
||||
{"8K", 8192, false},
|
||||
{"8KWithPool", 8192, true},
|
||||
{"16K", 16384, false},
|
||||
{"16KWithPool", 16384, true},
|
||||
{"32K", 32768, false},
|
||||
{"32KWithPool", 32768, true},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
@@ -509,6 +513,18 @@ func BenchmarkGet(b *testing.B) {
|
||||
key := "foo"
|
||||
value := []byte(strings.Repeat(" ", tt.size))
|
||||
|
||||
options := []Option{
|
||||
WithMaxKeySize(len(key)),
|
||||
WithMaxValueSize(tt.size),
|
||||
}
|
||||
if tt.withPool {
|
||||
options = append(options, WithMemPool(1))
|
||||
}
|
||||
db, err := Open(testdir, options...)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
err = db.Put(key, value)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
@@ -524,6 +540,8 @@ func BenchmarkGet(b *testing.B) {
|
||||
b.Errorf("unexpected value")
|
||||
}
|
||||
}
|
||||
b.StopTimer()
|
||||
db.Close()
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -547,15 +565,15 @@ func BenchmarkPut(b *testing.B) {
|
||||
defer db.Close()
|
||||
|
||||
tests := []benchmarkTestCase{
|
||||
{"128B", 128},
|
||||
{"256B", 256},
|
||||
{"512B", 512},
|
||||
{"1K", 1024},
|
||||
{"2K", 2048},
|
||||
{"4K", 4096},
|
||||
{"8K", 8192},
|
||||
{"16K", 16384},
|
||||
{"32K", 32768},
|
||||
{"128B", 128, false},
|
||||
{"256B", 256, false},
|
||||
{"512B", 512, false},
|
||||
{"1K", 1024, false},
|
||||
{"2K", 2048, false},
|
||||
{"4K", 4096, false},
|
||||
{"8K", 8192, false},
|
||||
{"16K", 16384, false},
|
||||
{"32K", 32768, false},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
Reference in New Issue
Block a user