trie: use a scratchspace for path

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)
This commit is contained in:
Martin Holst Swende 2024-11-11 14:38:39 +01:00
parent 5d3e3e30ca
commit d5c2af7088
No known key found for this signature in database
GPG Key ID: 683B438C05A5DDF0
1 changed files with 8 additions and 5 deletions

View File

@ -48,16 +48,19 @@ type StackTrie struct {
last []byte last []byte
onTrieNode OnTrieNode onTrieNode OnTrieNode
keyScratch []byte keyScratch []byte
pathScratch []byte
} }
// NewStackTrie allocates and initializes an empty trie. The committed nodes // NewStackTrie allocates and initializes an empty trie. The committed nodes
// will be discarded immediately if no callback is configured. // will be discarded immediately if no callback is configured.
func NewStackTrie(onTrieNode OnTrieNode) *StackTrie { func NewStackTrie(onTrieNode OnTrieNode) *StackTrie {
return &StackTrie{ return &StackTrie{
root: stPool.Get().(*stNode), root: stPool.Get().(*stNode),
h: newHasher(false), h: newHasher(false),
onTrieNode: onTrieNode, 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 { } else {
t.last = append(t.last[:0], k...) // reuse key slice 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 return nil
} }