@@ -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+
1136func 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
178210func (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
198237func (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