Skip to content

Commit c4c5e8f

Browse files
committed
Reuse key reflect.Value when making a map
This decreases the number of allocations by around 20% and provides an up to 5% performance boost, depending on what we are unmarshaling into.
1 parent 14e00f8 commit c4c5e8f

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

decoder.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,8 @@ func (d *decoder) decodeMap(
459459
result.Set(reflect.MakeMapWithSize(result.Type(), int(size)))
460460
}
461461

462+
mapType := result.Type()
463+
keyValue := reflect.New(mapType.Key()).Elem()
462464
for i := uint(0); i < size; i++ {
463465
var key []byte
464466
var err error
@@ -473,7 +475,9 @@ func (d *decoder) decodeMap(
473475
if err != nil {
474476
return 0, err
475477
}
476-
result.SetMapIndex(reflect.ValueOf(string(key)), value.Elem())
478+
479+
keyValue.SetString(string(key))
480+
result.SetMapIndex(keyValue, value.Elem())
477481
}
478482
return offset, nil
479483
}

0 commit comments

Comments
 (0)