Skip to content

Commit 807e4a8

Browse files
author
Matt Good
committed
Optimize 0-length array case
Instead of checking the array length in encode, this can be checked up front in `encoderOfArray` since the array type has a fixed length determined at compile time. So return an `emptyArrayEncoder` that simply writes an empty array to the stream.
1 parent ba38577 commit 807e4a8

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

feature_reflect_array.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,37 @@ func decoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecod
1313
}
1414

1515
func encoderOfArray(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
16+
if typ.Len() == 0 {
17+
return emptyArrayEncoder{}
18+
}
1619
encoder := encoderOfType(cfg, prefix+"[array]->", typ.Elem())
1720
if typ.Elem().Kind() == reflect.Map {
1821
encoder = &OptionalEncoder{encoder}
1922
}
2023
return &arrayEncoder{typ, typ.Elem(), encoder}
2124
}
2225

26+
type emptyArrayEncoder struct{}
27+
28+
func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
29+
stream.WriteEmptyArray()
30+
}
31+
32+
func (encoder emptyArrayEncoder) EncodeInterface(val interface{}, stream *Stream) {
33+
stream.WriteEmptyArray()
34+
}
35+
36+
func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool {
37+
return true
38+
}
39+
2340
type arrayEncoder struct {
2441
arrayType reflect.Type
2542
elemType reflect.Type
2643
elemEncoder ValEncoder
2744
}
2845

2946
func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
30-
if encoder.arrayType.Len() == 0 {
31-
stream.WriteEmptyArray()
32-
return
33-
}
3447
stream.WriteArrayStart()
3548
elemPtr := unsafe.Pointer(ptr)
3649
encoder.elemEncoder.Encode(elemPtr, stream)

0 commit comments

Comments
 (0)