mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 23:26:44 +00:00
perf: use fastcache for zktrie node (#172)
* * benchmark add benchmark for zktrie * * improve: use fastcache for zktrie node
This commit is contained in:
parent
ae2ab39570
commit
f21acfee4a
2 changed files with 89 additions and 0 deletions
|
|
@ -42,10 +42,24 @@ func (l *ZktrieDatabase) Get(key []byte) ([]byte, error) {
|
|||
if ok {
|
||||
return value, nil
|
||||
}
|
||||
|
||||
if l.db.cleans != nil {
|
||||
if enc := l.db.cleans.Get(nil, concatKey); enc != nil {
|
||||
memcacheCleanHitMeter.Mark(1)
|
||||
memcacheCleanReadMeter.Mark(int64(len(enc)))
|
||||
return enc, nil
|
||||
}
|
||||
}
|
||||
|
||||
v, err := l.db.diskdb.Get(concatKey)
|
||||
if err == leveldb.ErrNotFound {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
if l.db.cleans != nil {
|
||||
l.db.cleans.Set(concatKey[:], v)
|
||||
memcacheCleanMissMeter.Mark(1)
|
||||
memcacheCleanWriteMeter.Mark(int64(len(v)))
|
||||
}
|
||||
return v, err
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,9 @@ package trie
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"runtime"
|
||||
"sync"
|
||||
"testing"
|
||||
|
|
@ -27,6 +30,7 @@ import (
|
|||
zkt "github.com/scroll-tech/zktrie/types"
|
||||
|
||||
"github.com/scroll-tech/go-ethereum/common"
|
||||
"github.com/scroll-tech/go-ethereum/ethdb/leveldb"
|
||||
"github.com/scroll-tech/go-ethereum/ethdb/memorydb"
|
||||
)
|
||||
|
||||
|
|
@ -148,3 +152,74 @@ func TestZkTrieConcurrency(t *testing.T) {
|
|||
// Wait for all threads to finish
|
||||
pend.Wait()
|
||||
}
|
||||
|
||||
func tempDBZK(b *testing.B) (string, *Database) {
|
||||
dir, err := ioutil.TempDir("", "zktrie-bench")
|
||||
assert.NoError(b, err)
|
||||
|
||||
diskdb, err := leveldb.New(dir, 256, 0, "", false)
|
||||
assert.NoError(b, err)
|
||||
config := &Config{Cache: 256, Preimages: true, Zktrie: true}
|
||||
return dir, NewDatabaseWithConfig(diskdb, config)
|
||||
}
|
||||
|
||||
const benchElemCountZk = 10000
|
||||
|
||||
func BenchmarkZkTrieGet(b *testing.B) {
|
||||
_, tmpdb := tempDBZK(b)
|
||||
zkTrie, _ := NewZkTrie(common.Hash{}, NewZktrieDatabaseFromTriedb(tmpdb))
|
||||
defer func() {
|
||||
ldb := zkTrie.db.db.diskdb.(*leveldb.Database)
|
||||
ldb.Close()
|
||||
os.RemoveAll(ldb.Path())
|
||||
}()
|
||||
|
||||
k := make([]byte, 32)
|
||||
for i := 0; i < benchElemCountZk; i++ {
|
||||
binary.LittleEndian.PutUint64(k, uint64(i))
|
||||
|
||||
err := zkTrie.TryUpdate(k, k)
|
||||
assert.NoError(b, err)
|
||||
}
|
||||
|
||||
zkTrie.db.db.Commit(common.Hash{}, true, nil)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
binary.LittleEndian.PutUint64(k, uint64(i))
|
||||
_, err := zkTrie.TryGet(k)
|
||||
assert.NoError(b, err)
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
||||
func BenchmarkZkTrieUpdate(b *testing.B) {
|
||||
_, tmpdb := tempDBZK(b)
|
||||
zkTrie, _ := NewZkTrie(common.Hash{}, NewZktrieDatabaseFromTriedb(tmpdb))
|
||||
defer func() {
|
||||
ldb := zkTrie.db.db.diskdb.(*leveldb.Database)
|
||||
ldb.Close()
|
||||
os.RemoveAll(ldb.Path())
|
||||
}()
|
||||
|
||||
k := make([]byte, 32)
|
||||
v := make([]byte, 32)
|
||||
b.ReportAllocs()
|
||||
|
||||
for i := 0; i < benchElemCountZk; i++ {
|
||||
binary.LittleEndian.PutUint64(k, uint64(i))
|
||||
err := zkTrie.TryUpdate(k, k)
|
||||
assert.NoError(b, err)
|
||||
}
|
||||
binary.LittleEndian.PutUint64(k, benchElemCountZk/2)
|
||||
|
||||
//zkTrie.Commit(nil)
|
||||
zkTrie.db.db.Commit(common.Hash{}, true, nil)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
binary.LittleEndian.PutUint64(k, uint64(i))
|
||||
binary.LittleEndian.PutUint64(v, 0xffffffff+uint64(i))
|
||||
err := zkTrie.TryUpdate(k, v)
|
||||
assert.NoError(b, err)
|
||||
}
|
||||
b.StopTimer()
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue