diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-10-13 16:10:02 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2017-10-13 16:22:38 +0800 |
commit | a5fcaa55ac12a1861f13ab0096db1afecbc15904 (patch) | |
tree | 57ea83d835ed3fb4e453f3b57aaf85db7cd2ec1d | |
parent | 0ed4d76c7983f7f9aa54cd97268b71c890403a8a (diff) | |
download | dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.tar dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.tar.gz dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.tar.bz2 dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.tar.lz dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.tar.xz dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.tar.zst dexon-a5fcaa55ac12a1861f13ab0096db1afecbc15904.zip |
trie: make hasher benchmark meaningful post-caches
-rw-r--r-- | trie/trie_test.go | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/trie/trie_test.go b/trie/trie_test.go index 1c9095070..1e28c3bc4 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "io/ioutil" + "math/big" "math/rand" "os" "reflect" @@ -30,7 +31,9 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rlp" ) func init() { @@ -505,8 +508,6 @@ 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 @@ -549,18 +550,39 @@ func benchUpdate(b *testing.B, e binary.ByteOrder) *Trie { return trie } -func benchHash(b *testing.B, e binary.ByteOrder) { +// Benchmarks the trie hashing. Since the trie caches the result of any operation, +// we cannot use b.N as the number of hashing rouns, since all rounds apart from +// the first one will be NOOP. As such, we'll use b.N as the number of account to +// insert into the trie before measuring the hashing. +func BenchmarkHash(b *testing.B) { + // Make the random benchmark deterministic + random := rand.New(rand.NewSource(0)) + + // Create a realistic account trie to hash + addresses := make([][20]byte, b.N) + for i := 0; i < len(addresses); i++ { + for j := 0; j < len(addresses[i]); j++ { + addresses[i][j] = byte(random.Intn(256)) + } + } + accounts := make([][]byte, len(addresses)) + for i := 0; i < len(accounts); i++ { + var ( + nonce = uint64(random.Int63()) + balance = new(big.Int).Rand(random, new(big.Int).Exp(common.Big2, common.Big256, nil)) + root = emptyRoot + code = crypto.Keccak256(nil) + ) + accounts[i], _ = rlp.EncodeToBytes([]interface{}{nonce, balance, root, code}) + } + // Insert the accounts into the trie and hash it trie := newEmpty() - k := make([]byte, 32) - for i := 0; i < benchElemCount; i++ { - e.PutUint64(k, uint64(i)) - trie.Update(k, k) + for i := 0; i < len(addresses); i++ { + trie.Update(crypto.Keccak256(addresses[i][:]), accounts[i]) } - b.ResetTimer() - for i := 0; i < b.N; i++ { - trie.Hash() - } + b.ReportAllocs() + trie.Hash() } func tempDB() (string, Database) { |