rlp: optimize byte array handling (#22924)
This change improves the performance of encoding/decoding [N]byte. name old time/op new time/op delta DecodeByteArrayStruct-8 336ns ± 0% 246ns ± 0% -26.98% (p=0.000 n=9+10) EncodeByteArrayStruct-8 225ns ± 1% 148ns ± 1% -34.12% (p=0.000 n=10+10) name old alloc/op new alloc/op delta DecodeByteArrayStruct-8 120B ± 0% 48B ± 0% -60.00% (p=0.000 n=10+10) EncodeByteArrayStruct-8 0.00B 0.00B ~ (all equal)
This commit is contained in:
@ -348,25 +348,23 @@ func decodeByteArray(s *Stream, val reflect.Value) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
vlen := val.Len()
|
||||
slice := byteArrayBytes(val)
|
||||
switch kind {
|
||||
case Byte:
|
||||
if vlen == 0 {
|
||||
if len(slice) == 0 {
|
||||
return &decodeError{msg: "input string too long", typ: val.Type()}
|
||||
}
|
||||
if vlen > 1 {
|
||||
} else if len(slice) > 1 {
|
||||
return &decodeError{msg: "input string too short", typ: val.Type()}
|
||||
}
|
||||
bv, _ := s.Uint()
|
||||
val.Index(0).SetUint(bv)
|
||||
slice[0] = s.byteval
|
||||
s.kind = -1
|
||||
case String:
|
||||
if uint64(vlen) < size {
|
||||
if uint64(len(slice)) < size {
|
||||
return &decodeError{msg: "input string too long", typ: val.Type()}
|
||||
}
|
||||
if uint64(vlen) > size {
|
||||
if uint64(len(slice)) > size {
|
||||
return &decodeError{msg: "input string too short", typ: val.Type()}
|
||||
}
|
||||
slice := val.Slice(0, vlen).Interface().([]byte)
|
||||
if err := s.readFull(slice); err != nil {
|
||||
return err
|
||||
}
|
||||
|
Reference in New Issue
Block a user