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:
parent
5d3e3e30ca
commit
d5c2af7088
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue