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
|
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
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue