Skip to content

Commit 9e5a51a

Browse files
authored
profile: optimize Parse allocs (#951)
`go test -bench='^\QBenchmarkParse\E$' -run='^$' -count=10 -benchtime=5s` ``` goos: linux goarch: amd64 pkg: github.com/google/pprof/profile cpu: 13th Gen Intel(R) Core(TM) i7-1360P │ old-parse.txt │ new-parse.txt │ │ sec/op │ sec/op vs base │ Parse-16 62.07m ± 13% 55.54m ± 13% -10.52% (p=0.035 n=10) │ old-parse.txt │ new-parse.txt │ │ B/op │ B/op vs base │ Parse-16 47.56Mi ± 0% 41.09Mi ± 0% -13.59% (p=0.000 n=10) │ old-parse.txt │ new-parse.txt │ │ allocs/op │ allocs/op vs base │ Parse-16 272.9k ± 0% 175.8k ± 0% -35.58% (p=0.000 n=10) ```
1 parent 8b542ba commit 9e5a51a

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

profile/proto.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ package profile
3636
import (
3737
"errors"
3838
"fmt"
39+
"slices"
3940
)
4041

4142
type buffer struct {
@@ -187,6 +188,16 @@ func le32(p []byte) uint32 {
187188
return uint32(p[0]) | uint32(p[1])<<8 | uint32(p[2])<<16 | uint32(p[3])<<24
188189
}
189190

191+
func peekNumVarints(data []byte) (numVarints int) {
192+
for ; len(data) > 0; numVarints++ {
193+
var err error
194+
if _, data, err = decodeVarint(data); err != nil {
195+
break
196+
}
197+
}
198+
return numVarints
199+
}
200+
190201
func decodeVarint(data []byte) (uint64, []byte, error) {
191202
var u uint64
192203
for i := 0; ; i++ {
@@ -286,6 +297,9 @@ func decodeInt64(b *buffer, x *int64) error {
286297
func decodeInt64s(b *buffer, x *[]int64) error {
287298
if b.typ == 2 {
288299
// Packed encoding
300+
dataLen := peekNumVarints(b.data)
301+
*x = slices.Grow(*x, dataLen)
302+
289303
data := b.data
290304
for len(data) > 0 {
291305
var u uint64
@@ -316,8 +330,11 @@ func decodeUint64(b *buffer, x *uint64) error {
316330

317331
func decodeUint64s(b *buffer, x *[]uint64) error {
318332
if b.typ == 2 {
319-
data := b.data
320333
// Packed encoding
334+
dataLen := peekNumVarints(b.data)
335+
*x = slices.Grow(*x, dataLen)
336+
337+
data := b.data
321338
for len(data) > 0 {
322339
var u uint64
323340
var err error

0 commit comments

Comments
 (0)