mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-24 13:46:43 +00:00
trie: add sync pool
This commit is contained in:
parent
a80f906f09
commit
4c85ff8ca5
2 changed files with 21 additions and 2 deletions
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue