triedb/pathdb: use binary.append to eliminate the tmp slice

Signed-off-by: jsvisa <delweng@gmail.com>
This commit is contained in:
jsvisa 2025-07-21 17:30:01 +08:00
parent 34278a7509
commit 125e933da1

View file

@ -221,16 +221,13 @@ func (br *blockReader) readGreaterThan(id uint64) (uint64, error) {
type blockWriter struct {
desc *indexBlockDesc // Descriptor of the block
restarts []uint16 // Offsets into the data slice, marking the start of each section
scratch []byte // Buffer used for encoding full integers or value differences
data []byte // Aggregated encoded data slice
}
func newBlockWriter(blob []byte, desc *indexBlockDesc) (*blockWriter, error) {
scratch := make([]byte, binary.MaxVarintLen64)
if len(blob) == 0 {
return &blockWriter{
desc: desc,
scratch: scratch,
data: make([]byte, 0, 1024),
}, nil
}
@ -241,7 +238,6 @@ func newBlockWriter(blob []byte, desc *indexBlockDesc) (*blockWriter, error) {
return &blockWriter{
desc: desc,
restarts: restarts,
scratch: scratch,
data: data, // safe to own the slice
}, nil
}
@ -268,15 +264,12 @@ func (b *blockWriter) append(id uint64) error {
//
// The first element in a restart range is encoded using its
// full value.
n := binary.PutUvarint(b.scratch[0:], id)
b.data = append(b.data, b.scratch[:n]...)
b.data = binary.AppendUvarint(b.data, id)
} else {
// The current section is not full, append the element.
// The element which is not the first one in the section
// is encoded using the value difference from the preceding
// element.
n := binary.PutUvarint(b.scratch[0:], id-b.desc.max)
b.data = append(b.data, b.scratch[:n]...)
b.data = binary.AppendUvarint(b.data, id-b.desc.max)
}
b.desc.entries++
@ -392,11 +385,14 @@ func (b *blockWriter) full() bool {
//
// This function is safe to be called multiple times.
func (b *blockWriter) finish() []byte {
var buf []byte
for _, number := range b.restarts {
binary.BigEndian.PutUint16(b.scratch[:2], number)
buf = append(buf, b.scratch[:2]...)
restartsLen := len(b.restarts)
buf := make([]byte, len(b.data)+restartsLen*2+1)
copy(buf, b.data)
restartsOffset := len(b.data)
for i, restart := range b.restarts {
binary.BigEndian.PutUint16(buf[restartsOffset+2*i:], restart)
}
buf = append(buf, byte(len(b.restarts)))
return append(b.data, buf...)
buf[len(buf)-1] = byte(restartsLen)
return buf
}