Skip to content

Commit 4d055ba

Browse files
committed
Sometimes reuse element value when decoding map
We can do this when we are not decoding to an interface. This provides a ~9% performance increase with the full City struct.
1 parent fa8c86e commit 4d055ba

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

decoder.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,8 @@ func (d *decoder) decodeMap(
462462
mapType := result.Type()
463463
keyValue := reflect.New(mapType.Key()).Elem()
464464
elemType := mapType.Elem()
465+
elemKind := elemType.Kind()
466+
var elemValue reflect.Value
465467
for i := uint(0); i < size; i++ {
466468
var key []byte
467469
var err error
@@ -471,7 +473,10 @@ func (d *decoder) decodeMap(
471473
return 0, err
472474
}
473475

474-
elemValue := reflect.New(elemType).Elem()
476+
if !elemValue.IsValid() || elemKind == reflect.Interface {
477+
elemValue = reflect.New(elemType).Elem()
478+
}
479+
475480
offset, err = d.decode(offset, elemValue, depth)
476481
if err != nil {
477482
return 0, err

0 commit comments

Comments
 (0)