From 0323853adad17c11c81b17aa20c233eedef272a5 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Mon, 11 Nov 2024 14:38:39 +0100 Subject: [PATCH] trie: use a scratchspace for path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit goos: linux goarch: amd64 pkg: github.com/ethereum/go-ethereum/trie cpu: 12th Gen Intel(R) Core(TM) i7-1270P │ stacktrie.3 │ stacktrie.4 │ │ sec/op │ sec/op vs base │ Insert100K-8 69.50m ± 12% 74.59m ± 14% ~ (p=0.128 n=7) │ stacktrie.3 │ stacktrie.4 │ │ B/op │ B/op vs base │ Insert100K-8 4.640Mi ± 0% 3.112Mi ± 0% -32.93% (p=0.001 n=7) │ stacktrie.3 │ stacktrie.4 │ │ allocs/op │ allocs/op vs base │ Insert100K-8 226.7k ± 0% 126.7k ± 0% -44.11% (p=0.001 n=7) --- trie/stacktrie.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/trie/stacktrie.go b/trie/stacktrie.go index 409e8a1136..247ab777df 100644 --- a/trie/stacktrie.go +++ b/trie/stacktrie.go @@ -48,16 +48,19 @@ type StackTrie struct { last []byte onTrieNode OnTrieNode - keyScratch []byte + keyScratch []byte + pathScratch []byte } // NewStackTrie allocates and initializes an empty trie. The committed nodes // will be discarded immediately if no callback is configured. func NewStackTrie(onTrieNode OnTrieNode) *StackTrie { return &StackTrie{ - root: stPool.Get().(*stNode), - h: newHasher(false), - onTrieNode: onTrieNode, + root: stPool.Get().(*stNode), + h: newHasher(false), + onTrieNode: onTrieNode, + keyScratch: make([]byte, 0, 32), + pathScratch: make([]byte, 0, 32), } } @@ -86,7 +89,7 @@ func (t *StackTrie) Update(key, value []byte) error { } else { t.last = append(t.last[:0], k...) // reuse key slice } - t.insert(t.root, k, value, nil) + t.insert(t.root, k, value, t.pathScratch[:0]) return nil }