trie: add sync pool

This commit is contained in:
Gary Rong 2025-05-25 21:04:19 +08:00
parent a80f906f09
commit 4c85ff8ca5
2 changed files with 21 additions and 2 deletions

View file

@ -110,10 +110,19 @@ func (h *hasher) encodeShortNode(n *shortNode) []byte {
return h.encodedBytes()
}
var fnEncoderPool = sync.Pool{
New: func() interface{} {
var enc fullnodeEncoder
return &enc
},
}
// encodeFullNode returns a copy of the supplied fullNode, with its child
// being replaced by either the hash or an embedded node if the child is small.
func (h *hasher) encodeFullNode(n *fullNode) []byte {
var fn fullnodeEncoder
fn := fnEncoderPool.Get().(*fullnodeEncoder)
fn.reset()
if h.parallel {
var wg sync.WaitGroup
for i := 0; i < 16; i++ {
@ -142,6 +151,8 @@ func (h *hasher) encodeFullNode(n *fullNode) []byte {
fn.Children[16] = n.Children[16].(valueNode)
}
fn.encode(h.encbuf)
fnEncoderPool.Put(fn)
return h.encodedBytes()
}

View file

@ -43,7 +43,7 @@ func (n *fullNode) encode(w rlp.EncoderBuffer) {
func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) {
offset := w.List()
for i, c := range n.Children {
if c == nil {
if len(c) == 0 {
w.Write(rlp.EmptyString)
} else {
if i == 16 {
@ -60,6 +60,14 @@ func (n *fullnodeEncoder) encode(w rlp.EncoderBuffer) {
w.ListEnd(offset)
}
func (n *fullnodeEncoder) reset() {
for i, c := range n.Children {
if len(c) != 0 {
n.Children[i] = n.Children[i][:0]
}
}
}
func (n *shortNode) encode(w rlp.EncoderBuffer) {
offset := w.List()
w.WriteBytes(n.Key)