Skip to content

Commit a09108f

Browse files
committed
internal/profile: optimize Parse performance
1 parent 385dc33 commit a09108f

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

src/internal/profile/proto.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ package profile
2424
import (
2525
"errors"
2626
"fmt"
27+
"slices"
2728
)
2829

2930
type buffer struct {
@@ -175,6 +176,16 @@ func le32(p []byte) uint32 {
175176
return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
176177
}
177178

179+
func peekNumVarints(data []byte) (numVarints int) {
180+
for ; len(data) > 0; numVarints++ {
181+
var err error
182+
if _, data, err = decodeVarint(data); err != nil {
183+
break
184+
}
185+
}
186+
return numVarints
187+
}
188+
178189
func decodeVarint(data []byte) (uint64, []byte, error) {
179190
var i int
180191
var u uint64
@@ -275,6 +286,9 @@ func decodeInt64(b *buffer, x *int64) error {
275286
func decodeInt64s(b *buffer, x *[]int64) error {
276287
if b.typ == 2 {
277288
// Packed encoding
289+
dataLen := peekNumVarints(b.data)
290+
*x = slices.Grow(*x, dataLen)
291+
278292
data := b.data
279293
for len(data) > 0 {
280294
var u uint64
@@ -305,8 +319,11 @@ func decodeUint64(b *buffer, x *uint64) error {
305319

306320
func decodeUint64s(b *buffer, x *[]uint64) error {
307321
if b.typ == 2 {
308-
data := b.data
309322
// Packed encoding
323+
dataLen := peekNumVarints(b.data)
324+
*x = slices.Grow(*x, dataLen)
325+
326+
data := b.data
310327
for len(data) > 0 {
311328
var u uint64
312329
var err error

0 commit comments

Comments
 (0)