mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 10:52:25 +00:00
benchmark io for leveldb and pebble
This commit is contained in:
parent
2f66d7c47c
commit
45377b1526
3 changed files with 132 additions and 0 deletions
|
|
@ -531,3 +531,88 @@ func makeDataset(size, ksize, vsize int, order bool) ([][]byte, [][]byte) {
|
|||
}
|
||||
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)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
package leveldb
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
package pebble
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue