]> Cypherpunks.ru repositories - gostls13.git/commitdiff
encoding/asn1: improve memory efficiency of ObjectIdentifier.String
authorMateusz Poliwczak <mpoliwczak34@gmail.com>
Wed, 29 Mar 2023 17:04:54 +0000 (17:04 +0000)
committerRoland Shoemaker <roland@golang.org>
Wed, 29 Mar 2023 18:24:36 +0000 (18:24 +0000)
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: 361d68dc9b64c50e3b20e2cf91bffe54cfaf10d4
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>

src/encoding/asn1/asn1.go
src/encoding/asn1/asn1_test.go

index f743cd6f69e9568db4d7907c8d71ad55f6584efa..e7bf793a8272e60983bdee48254c0e77d9238f1c 100644 (file)
@@ -26,6 +26,7 @@ import (
        "math/big"
        "reflect"
        "strconv"
+       "strings"
        "time"
        "unicode/utf16"
        "unicode/utf8"
@@ -236,16 +237,18 @@ func (oi ObjectIdentifier) Equal(other ObjectIdentifier) bool {
 }
 
 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 {
                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
index 0e67dbf3966bc5e8a92351070fb6913f019d6efe..9a605e245c13698f324281ba3fdec9dffdba8184 100644 (file)
@@ -1168,3 +1168,10 @@ func TestNonMinimalEncodedOID(t *testing.T) {
                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()
+       }
+}