mpt: use BinWriter.Grow()
instead of custom buffer
Also add benchmarks. Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
parent
c74de9a579
commit
73e4040628
2 changed files with 43 additions and 5 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
39
pkg/core/mpt/bench_test.go
Normal file
39
pkg/core/mpt/bench_test.go
Normal 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))
|
||||||
|
})
|
||||||
|
}
|
Loading…
Reference in a new issue