mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-11 06:23:47 +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 {
|
if ok {
|
||||||
return value, nil
|
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)
|
v, err := l.db.diskdb.Get(concatKey)
|
||||||
if err == leveldb.ErrNotFound {
|
if err == leveldb.ErrNotFound {
|
||||||
return nil, 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
|
return v, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,9 @@ package trie
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/binary"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
@ -27,6 +30,7 @@ import (
|
||||||
zkt "github.com/scroll-tech/zktrie/types"
|
zkt "github.com/scroll-tech/zktrie/types"
|
||||||
|
|
||||||
"github.com/scroll-tech/go-ethereum/common"
|
"github.com/scroll-tech/go-ethereum/common"
|
||||||
|
"github.com/scroll-tech/go-ethereum/ethdb/leveldb"
|
||||||
"github.com/scroll-tech/go-ethereum/ethdb/memorydb"
|
"github.com/scroll-tech/go-ethereum/ethdb/memorydb"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -148,3 +152,74 @@ func TestZkTrieConcurrency(t *testing.T) {
|
||||||
// Wait for all threads to finish
|
// Wait for all threads to finish
|
||||||
pend.Wait()
|
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