forked from cerc-io/plugeth
trie: improve benchmarks
This commit is contained in:
parent
e56cbc225e
commit
6b91a4abe5
@ -18,11 +18,15 @@ package trie
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/ethereum/go-ethereum/common"
|
||||
"github.com/ethereum/go-ethereum/crypto"
|
||||
"github.com/ethereum/go-ethereum/ethdb"
|
||||
)
|
||||
|
||||
type Db map[string][]byte
|
||||
@ -100,7 +104,6 @@ func TestGet(t *testing.T) {
|
||||
|
||||
func TestDelete(t *testing.T) {
|
||||
trie := NewEmpty()
|
||||
|
||||
vals := []struct{ k, v string }{
|
||||
{"do", "verb"},
|
||||
{"ether", "wookiedoo"},
|
||||
@ -254,39 +257,6 @@ func TestOutput(t *testing.T) {
|
||||
fmt.Println(trie2.root)
|
||||
}
|
||||
|
||||
func BenchmarkGets(b *testing.B) {
|
||||
trie := NewEmpty()
|
||||
vals := []struct{ k, v string }{
|
||||
{"do", "verb"},
|
||||
{"ether", "wookiedoo"},
|
||||
{"horse", "stallion"},
|
||||
{"shaman", "horse"},
|
||||
{"doge", "coin"},
|
||||
{"ether", ""},
|
||||
{"dog", "puppy"},
|
||||
{"shaman", ""},
|
||||
{"somethingveryoddindeedthis is", "myothernodedata"},
|
||||
}
|
||||
for _, val := range vals {
|
||||
trie.UpdateString(val.k, val.v)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
trie.Get([]byte("horse"))
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkUpdate(b *testing.B) {
|
||||
trie := NewEmpty()
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
trie.UpdateString(fmt.Sprintf("aaaaaaaaa%d", i), "value")
|
||||
}
|
||||
trie.Hash()
|
||||
}
|
||||
|
||||
type kv struct {
|
||||
k, v []byte
|
||||
t bool
|
||||
@ -352,3 +322,71 @@ func TestSecureDelete(t *testing.T) {
|
||||
t.Errorf("expected %x got %x", exp, hash)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkGet(b *testing.B) { benchGet(b, false) }
|
||||
func BenchmarkGetDB(b *testing.B) { benchGet(b, true) }
|
||||
func BenchmarkUpdateBE(b *testing.B) { benchUpdate(b, binary.BigEndian) }
|
||||
func BenchmarkUpdateLE(b *testing.B) { benchUpdate(b, binary.LittleEndian) }
|
||||
func BenchmarkHashBE(b *testing.B) { benchHash(b, binary.BigEndian) }
|
||||
func BenchmarkHashLE(b *testing.B) { benchHash(b, binary.LittleEndian) }
|
||||
|
||||
const benchElemCount = 20000
|
||||
|
||||
func benchGet(b *testing.B, commit bool) {
|
||||
trie := New(nil, nil)
|
||||
if commit {
|
||||
dir, tmpdb := tempDB()
|
||||
defer os.RemoveAll(dir)
|
||||
trie = New(nil, tmpdb)
|
||||
}
|
||||
k := make([]byte, 32)
|
||||
for i := 0; i < benchElemCount; i++ {
|
||||
binary.LittleEndian.PutUint64(k, uint64(i))
|
||||
trie.Update(k, k)
|
||||
}
|
||||
binary.LittleEndian.PutUint64(k, benchElemCount/2)
|
||||
if commit {
|
||||
trie.Commit()
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
trie.Get(k)
|
||||
}
|
||||
}
|
||||
|
||||
func benchUpdate(b *testing.B, e binary.ByteOrder) *Trie {
|
||||
trie := NewEmpty()
|
||||
k := make([]byte, 32)
|
||||
for i := 0; i < b.N; i++ {
|
||||
e.PutUint64(k, uint64(i))
|
||||
trie.Update(k, k)
|
||||
}
|
||||
return trie
|
||||
}
|
||||
|
||||
func benchHash(b *testing.B, e binary.ByteOrder) {
|
||||
trie := NewEmpty()
|
||||
k := make([]byte, 32)
|
||||
for i := 0; i < benchElemCount; i++ {
|
||||
e.PutUint64(k, uint64(i))
|
||||
trie.Update(k, k)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
trie.Hash()
|
||||
}
|
||||
}
|
||||
|
||||
func tempDB() (string, Backend) {
|
||||
dir, err := ioutil.TempDir("", "trie-bench")
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("can't create temporary directory: %v", err))
|
||||
}
|
||||
db, err := ethdb.NewLDBDatabase(dir, 300*1024)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("can't create temporary database: %v", err))
|
||||
}
|
||||
return dir, db
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user