1
0
mirror of https://github.com/golang/go synced 2024-11-23 01:20:02 -07:00

encoding/asn1: improve memory efficiency of ObjectIdentifier.String

name                      old time/op    new time/op    delta
ObjectIdentifierString-4     670ns ± 9%     157ns ±14%  -76.59%  (p=0.000 n=10+9)

name                      old alloc/op   new alloc/op   delta
ObjectIdentifierString-4      184B ± 0%       32B ± 0%  -82.61%  (p=0.000 n=10+10)

name                      old allocs/op  new allocs/op  delta
ObjectIdentifierString-4      14.0 ± 0%       1.0 ± 0%  -92.86%  (p=0.000 n=10+10)

This also improves the x509 certificate parser performance by ~12-15%

name                           old time/op    new time/op    delta
ParseCertificate/ecdsa_leaf-4    24.5µs ± 8%    20.9µs ±11%  -14.66%  (p=0.000 n=10+10)
ParseCertificate/rsa_leaf-4      26.6µs ± 5%    23.5µs ± 7%  -11.83%  (p=0.000 n=8+10)

name                           old alloc/op   new alloc/op   delta
ParseCertificate/ecdsa_leaf-4    12.5kB ± 0%    12.0kB ± 0%   -3.72%  (p=0.000 n=10+10)
ParseCertificate/rsa_leaf-4      13.9kB ± 0%    13.4kB ± 0%   -3.34%  (p=0.000 n=10+10)

name                           old allocs/op  new allocs/op  delta
ParseCertificate/ecdsa_leaf-4       238 ± 0%       165 ± 0%  -30.67%  (p=0.000 n=10+10)
ParseCertificate/rsa_leaf-4         262 ± 0%       189 ± 0%  -27.86%  (p=0.000 n=10+10)

Change-Id: I49905bbf8319b840e9211da73570db35d1445217
GitHub-Last-Rev: 361d68dc9b
GitHub-Pull-Request: golang/go#59198
Reviewed-on: https://go-review.googlesource.com/c/go/+/478836
Reviewed-by: Roland Shoemaker <roland@golang.org>
Reviewed-by: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Mateusz Poliwczak <mpoliwczak34@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Mateusz Poliwczak 2023-03-29 17:04:54 +00:00 committed by Roland Shoemaker
parent b441eb3f97
commit c292397160
2 changed files with 14 additions and 4 deletions

View File

@ -26,6 +26,7 @@ import (
"math/big" "math/big"
"reflect" "reflect"
"strconv" "strconv"
"strings"
"time" "time"
"unicode/utf16" "unicode/utf16"
"unicode/utf8" "unicode/utf8"
@ -236,16 +237,18 @@ func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool {
} }
func (oi ObjectIdentifier) String() string { func (oi ObjectIdentifier) String() string {
var s string var s strings.Builder
s.Grow(32)
buf := make([]byte, 0, 19)
for i, v := range oi { for i, v := range oi {
if i > 0 { if i > 0 {
s += "." s.WriteByte('.')
} }
s += strconv.Itoa(v) s.Write(strconv.AppendInt(buf, int64(v), 10))
} }
return s return s.String()
} }
// parseObjectIdentifier parses an OBJECT IDENTIFIER from the given bytes and // parseObjectIdentifier parses an OBJECT IDENTIFIER from the given bytes and

View File

@ -1168,3 +1168,10 @@ func TestNonMinimalEncodedOID(t *testing.T) {
t.Fatalf("accepted non-minimally encoded oid") t.Fatalf("accepted non-minimally encoded oid")
} }
} }
func BenchmarkObjectIdentifierString(b *testing.B) {
oidPublicKeyRSA := ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}
for i := 0; i < b.N; i++ {
_ = oidPublicKeyRSA.String()
}
}