Skip to content

Commit 03453cc

Browse files
authored
Merge pull request #54 from Basekick-Labs/perf/sorted-map-pool-keys
perf(encode): pool sorted map key slices
2 parents efe4285 + d509f27 commit 03453cc

1 file changed

Lines changed: 55 additions & 9 deletions

File tree

encode_map.go

Lines changed: 55 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,35 @@ import (
44
"math"
55
"reflect"
66
"sort"
7+
"sync"
78

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

12+
var sortedKeysPool = sync.Pool{
13+
New: func() interface{} {
14+
s := make([]string, 0, 16)
15+
return &s
16+
},
17+
}
18+
19+
func getSortedKeys(n int) *[]string {
20+
sp := sortedKeysPool.Get().(*[]string)
21+
if cap(*sp) < n {
22+
*sp = make([]string, 0, n)
23+
} else {
24+
*sp = (*sp)[:0]
25+
}
26+
return sp
27+
}
28+
29+
func putSortedKeys(sp *[]string) {
30+
if cap(*sp) > 1024 {
31+
return // don't retain oversized slices
32+
}
33+
sortedKeysPool.Put(sp)
34+
}
35+
1136
func encodeMapValue(e *Encoder, v reflect.Value) error {
1237
if v.IsNil() {
1338
return e.EncodeNil()
@@ -155,7 +180,8 @@ func (e *Encoder) EncodeMapSorted(m map[string]interface{}) error {
155180
return err
156181
}
157182

158-
keys := make([]string, 0, len(m))
183+
sp := getSortedKeys(len(m))
184+
keys := *sp
159185

160186
for k := range m {
161187
keys = append(keys, k)
@@ -165,53 +191,73 @@ func (e *Encoder) EncodeMapSorted(m map[string]interface{}) error {
165191

166192
for _, k := range keys {
167193
if err := e.EncodeString(k); err != nil {
194+
*sp = keys
195+
putSortedKeys(sp)
168196
return err
169197
}
170198
if err := e.Encode(m[k]); err != nil {
199+
*sp = keys
200+
putSortedKeys(sp)
171201
return err
172202
}
173203
}
174204

205+
*sp = keys
206+
putSortedKeys(sp)
175207
return nil
176208
}
177209

178210
func (e *Encoder) encodeSortedMapStringBool(m map[string]bool) error {
179-
keys := make([]string, 0, len(m))
211+
sp := getSortedKeys(len(m))
212+
keys := *sp
213+
180214
for k := range m {
181215
keys = append(keys, k)
182216
}
183217
sort.Strings(keys)
184218

185219
for _, k := range keys {
186-
err := e.EncodeString(k)
187-
if err != nil {
220+
if err := e.EncodeString(k); err != nil {
221+
*sp = keys
222+
putSortedKeys(sp)
188223
return err
189224
}
190-
if err = e.EncodeBool(m[k]); err != nil {
225+
if err := e.EncodeBool(m[k]); err != nil {
226+
*sp = keys
227+
putSortedKeys(sp)
191228
return err
192229
}
193230
}
194231

232+
*sp = keys
233+
putSortedKeys(sp)
195234
return nil
196235
}
197236

198237
func (e *Encoder) encodeSortedMapStringString(m map[string]string) error {
199-
keys := make([]string, 0, len(m))
238+
sp := getSortedKeys(len(m))
239+
keys := *sp
240+
200241
for k := range m {
201242
keys = append(keys, k)
202243
}
203244
sort.Strings(keys)
204245

205246
for _, k := range keys {
206-
err := e.EncodeString(k)
207-
if err != nil {
247+
if err := e.EncodeString(k); err != nil {
248+
*sp = keys
249+
putSortedKeys(sp)
208250
return err
209251
}
210-
if err = e.EncodeString(m[k]); err != nil {
252+
if err := e.EncodeString(m[k]); err != nil {
253+
*sp = keys
254+
putSortedKeys(sp)
211255
return err
212256
}
213257
}
214258

259+
*sp = keys
260+
putSortedKeys(sp)
215261
return nil
216262
}
217263

0 commit comments

Comments
 (0)