1
0
mirror of https://github.com/golang/go synced 2024-11-17 17:04:47 -07:00

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 <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Martin Möhrmann 2020-05-03 19:58:10 +02:00
parent cdc77d34d7
commit 861a948335

View File

@ -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