Skip to content

Commit ba9f557

Browse files
authored
Merge pull request #55 from Basekick-Labs/perf/unmarshal-rec-buffer
perf(decode): pool rec buffer in unmarshalValue
2 parents 03453cc + 9b26d44 commit ba9f557

1 file changed

Lines changed: 24 additions & 4 deletions

File tree

decode_value.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,18 @@ import (
55
"errors"
66
"fmt"
77
"reflect"
8+
"sync"
89

910
"github.com/vmihailenco/msgpack/v5/msgpcode"
1011
)
1112

13+
var recBufPool = sync.Pool{
14+
New: func() interface{} {
15+
b := make([]byte, 0, 64)
16+
return &b
17+
},
18+
}
19+
1220
var (
1321
interfaceType = reflect.TypeOf((*interface{})(nil)).Elem()
1422
stringType = reflect.TypeOf((*string)(nil)).Elem()
@@ -233,17 +241,29 @@ func decodeCustomValue(d *Decoder, v reflect.Value) error {
233241
}
234242

235243
func unmarshalValue(d *Decoder, v reflect.Value) error {
236-
var b []byte
244+
bp := recBufPool.Get().(*[]byte)
245+
*bp = (*bp)[:0]
237246

238-
d.rec = make([]byte, 0, 64)
247+
d.rec = *bp
239248
if err := d.Skip(); err != nil {
249+
d.rec = nil
250+
*bp = (*bp)[:0]
251+
recBufPool.Put(bp)
240252
return err
241253
}
242-
b = d.rec
254+
b := d.rec
243255
d.rec = nil
244256

245257
unmarshaler := v.Interface().(Unmarshaler)
246-
return unmarshaler.UnmarshalMsgpack(b)
258+
err := unmarshaler.UnmarshalMsgpack(b)
259+
260+
// Return buffer to pool; drop oversized buffers.
261+
if cap(b) <= 4096 {
262+
*bp = b
263+
recBufPool.Put(bp)
264+
}
265+
266+
return err
247267
}
248268

249269
// unmarshalBinaryOrTextValue peeks at the wire format to choose between

0 commit comments

Comments
 (0)