mpt: use BinWriter.Grow() instead of custom buffer

Also add benchmarks.

Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgeniy Stratonikov 2021-08-06 11:32:02 +03:00
parent c74de9a579
commit 73e4040628
2 changed files with 43 additions and 5 deletions

View file

@ -1,7 +1,6 @@
package mpt package mpt
import ( import (
"bytes"
"fmt" "fmt"
"github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/crypto/hash"
@ -64,10 +63,10 @@ func (b *BaseNode) updateHash(n Node) {
// updateCache updates hash and bytes fields for this BaseNode. // updateCache updates hash and bytes fields for this BaseNode.
func (b *BaseNode) updateBytes(n Node) { func (b *BaseNode) updateBytes(n Node) {
buf := bytes.NewBuffer(make([]byte, 0, 1+n.Size())) bw := io.NewBufBinWriter()
bw := io.NewBinWriterFromIO(buf) bw.Grow(1 + n.Size())
encodeNodeWithType(n, bw) encodeNodeWithType(n, bw.BinWriter)
b.bytes = buf.Bytes() b.bytes = bw.Bytes()
b.bytesValid = true b.bytesValid = true
} }

View file

@ -0,0 +1,39 @@
package mpt
import (
"testing"
"github.com/nspcc-dev/neo-go/internal/random"
)
func benchmarkBytes(b *testing.B, n Node) {
inv := n.(interface{ invalidateCache() })
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
inv.invalidateCache()
_ = n.Bytes()
}
}
func BenchmarkBytes(b *testing.B) {
b.Run("extension", func(b *testing.B) {
n := NewExtensionNode(random.Bytes(10), NewLeafNode(random.Bytes(10)))
benchmarkBytes(b, n)
})
b.Run("leaf", func(b *testing.B) {
n := NewLeafNode(make([]byte, 15))
benchmarkBytes(b, n)
})
b.Run("hash", func(b *testing.B) {
n := NewHashNode(random.Uint256())
benchmarkBytes(b, n)
})
b.Run("branch", func(b *testing.B) {
n := NewBranchNode()
n.Children[0] = NewLeafNode(random.Bytes(10))
n.Children[4] = NewLeafNode(random.Bytes(10))
n.Children[7] = NewLeafNode(random.Bytes(10))
n.Children[8] = NewLeafNode(random.Bytes(10))
})
}