benchmark io for leveldb and pebble

This commit is contained in:
Jin 2023-10-13 09:36:04 +08:00
parent 2f66d7c47c
commit 45377b1526
No known key found for this signature in database
GPG key ID: 1F8714949705D54B
3 changed files with 132 additions and 0 deletions

View file

@ -531,3 +531,88 @@ func makeDataset(size, ksize, vsize int, order bool) ([][]byte, [][]byte) {
} }
return keys, vals return keys, vals
} }
func BenchDatabaseSuite2(b *testing.B, New func() ethdb.KeyValueStore) {
var (
keys, vals = makeDataset(1000, 32, 32, false)
sKeys, sVals = makeDataset(1000, 32, 32, true)
)
// Run benchmarks sequentially
b.Run("Write", func(b *testing.B) {
benchWrite := func(b *testing.B, keys, vals [][]byte) {
db := New()
defer db.Close()
b.ResetTimer()
for i := 0; i < len(keys); i++ {
db.Put(keys[i], vals[i])
}
}
b.Run("WriteSorted", func(b *testing.B) {
benchWrite(b, sKeys, sVals)
})
b.Run("WriteRandom", func(b *testing.B) {
benchWrite(b, keys, vals)
})
})
b.Run("Read", func(b *testing.B) {
benchRead := func(b *testing.B, keys, vals [][]byte) {
db := New()
defer db.Close()
for i := 0; i < len(keys); i++ {
db.Put(keys[i], vals[i])
}
b.ResetTimer()
for i := 0; i < len(keys); i++ {
db.Get(keys[i])
}
}
b.Run("ReadSorted", func(b *testing.B) {
benchRead(b, sKeys, sVals)
})
b.Run("ReadRandom", func(b *testing.B) {
benchRead(b, keys, vals)
})
})
b.Run("Iteration", func(b *testing.B) {
benchIteration := func(b *testing.B, keys, vals [][]byte) {
db := New()
defer db.Close()
for i := 0; i < len(keys); i++ {
db.Put(keys[i], vals[i])
}
b.ResetTimer()
it := db.NewIterator(nil, nil)
for it.Next() {
}
it.Release()
}
b.Run("IterationSorted", func(b *testing.B) {
benchIteration(b, sKeys, sVals)
})
b.Run("IterationRandom", func(b *testing.B) {
benchIteration(b, keys, vals)
})
})
b.Run("BatchWrite", func(b *testing.B) {
benchBatchWrite := func(b *testing.B, keys, vals [][]byte) {
db := New()
defer db.Close()
b.ResetTimer()
batch := db.NewBatch()
for i := 0; i < len(keys); i++ {
batch.Put(keys[i], vals[i])
}
batch.Write()
}
b.Run("BenchWriteSorted", func(b *testing.B) {
benchBatchWrite(b, sKeys, sVals)
})
b.Run("BenchWriteRandom", func(b *testing.B) {
benchBatchWrite(b, keys, vals)
})
})
}

View file

@ -17,6 +17,7 @@
package leveldb package leveldb
import ( import (
"os"
"testing" "testing"
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
@ -50,3 +51,28 @@ func BenchmarkLevelDB(b *testing.B) {
} }
}) })
} }
func BenchmarkIOLevelDB(b *testing.B) {
dir, err := os.MkdirTemp("", "leveldb_*")
if err != nil {
b.Fatal(err)
}
var stor storage.Storage
stor, err = storage.OpenFile(dir, false)
if err != nil {
b.Fatal(err)
}
dbtest.BenchDatabaseSuite2(b, func() ethdb.KeyValueStore {
db, err := leveldb.Open(stor, nil)
if err != nil {
b.Fatal(err)
}
return &Database{
db: db,
}
})
err = os.RemoveAll(dir)
if err != nil {
b.Fatal(err)
}
}

View file

@ -19,6 +19,7 @@
package pebble package pebble
import ( import (
"os"
"testing" "testing"
"github.com/cockroachdb/pebble" "github.com/cockroachdb/pebble"
@ -56,3 +57,23 @@ func BenchmarkPebbleDB(b *testing.B) {
} }
}) })
} }
func BenchmarkIOPebbleDB(b *testing.B) {
dir, err := os.MkdirTemp("", "pebble_*")
if err != nil {
b.Fatal(err)
}
dbtest.BenchDatabaseSuite2(b, func() ethdb.KeyValueStore {
db, err := pebble.Open(dir, &pebble.Options{})
if err != nil {
b.Fatal(err)
}
return &Database{
db: db,
}
})
err = os.RemoveAll(dir)
if err != nil {
b.Fatal(err)
}
}