From: Martin Möhrmann Date: Sun, 3 May 2020 17:58:10 +0000 (+0200) Subject: encoding/asn1: speed up marshal by reducing allocations X-Git-Tag: go1.16beta1~1287 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=861a9483357a1a13609430ec6684b3dc9209e80c;p=gostls13.git encoding/asn1: speed up marshal by reducing allocations Replace strings.Split by strings.IndexByte and explicit slicing to avoid the allocation of the return slice of strings.Split. name old time/op new time/op delta Marshal 43.3µs ± 1% 36.7µs ± 1% -15.23% (p=0.000 n=9+9) name old alloc/op new alloc/op delta Marshal 10.7kB ± 0% 9.2kB ± 0% -13.96% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Marshal 444 ± 0% 366 ± 0% -17.57% (p=0.000 n=10+10) Change-Id: I9e727defa23f7e5fc684f246de0136fe28cf8d25 Reviewed-on: https://go-review.googlesource.com/c/go/+/231738 TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/encoding/asn1/common.go b/src/encoding/asn1/common.go index e2aa8bd9c5..1c712e1eff 100644 --- a/src/encoding/asn1/common.go +++ b/src/encoding/asn1/common.go @@ -92,7 +92,16 @@ type fieldParameters struct { // parseFieldParameters will parse it into a fieldParameters structure, // ignoring unknown parts of the string. func parseFieldParameters(str string) (ret fieldParameters) { - for _, part := range strings.Split(str, ",") { + var part string + for len(str) > 0 { + // This loop uses IndexByte and explicit slicing + // instead of strings.Split(str, ",") to reduce allocations. + i := strings.IndexByte(str, ',') + if i < 0 { + part, str = str, "" + } else { + part, str = str[:i], str[i+1:] + } switch { case part == "optional": ret.optional = true