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() 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 // 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. // being replaced by either the hash or an embedded node if the child is small.
func (h *hasher) encodeFullNode(n *fullNode) []byte { func (h *hasher) encodeFullNode(n *fullNode) []byte {
var fn fullnodeEncoder fn := fnEncoderPool.Get().(*fullnodeEncoder)
fn.reset()
if h.parallel { if h.parallel {
var wg sync.WaitGroup var wg sync.WaitGroup
for i := 0; i < 16; i++ { 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.Children[16] = n.Children[16].(valueNode)
} }
fn.encode(h.encbuf) fn.encode(h.encbuf)
fnEncoderPool.Put(fn)
return h.encodedBytes() return h.encodedBytes()
} }

View file

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