From d22cbe16dd0fefb38fafa5fe216f5ec1f1d83765 Mon Sep 17 00:00:00 2001 From: Paul Querna Date: Sat, 16 Nov 2019 15:05:44 -0800 Subject: [PATCH 1/2] Add benchmark for ParseSigned --- signing_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/signing_test.go b/signing_test.go index 5b013648..89b2ed7d 100644 --- a/signing_test.go +++ b/signing_test.go @@ -570,3 +570,13 @@ func TestSignerB64(t *testing.T) { t.Errorf("Input/output do not match, got '%s', expected '%s'", output, input) } } + +func BenchmarkParseSigned(b *testing.B) { + msg := `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c` + for i := 0; i < b.N; i++ { + _, err := ParseSigned(msg) + if err != nil { + b.Errorf("Error on parse: %s", err) + } + } +} \ No newline at end of file From 5b063f60741a237bdb50f6484379c935e1beea8a Mon Sep 17 00:00:00 2001 From: Paul Querna Date: Sat, 16 Nov 2019 15:12:04 -0800 Subject: [PATCH 2/2] Use string.Builder to remove whitespace, isntead of a regeexp --- encoding.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/encoding.go b/encoding.go index b9687c64..70f7385c 100644 --- a/encoding.go +++ b/encoding.go @@ -23,13 +23,12 @@ import ( "encoding/binary" "io" "math/big" - "regexp" + "strings" + "unicode" "gopkg.in/square/go-jose.v2/json" ) -var stripWhitespaceRegex = regexp.MustCompile("\\s") - // Helper function to serialize known-good objects. // Precondition: value is not a nil pointer. func mustSerializeJSON(value interface{}) []byte { @@ -56,7 +55,14 @@ func mustSerializeJSON(value interface{}) []byte { // Strip all newlines and whitespace func stripWhitespace(data string) string { - return stripWhitespaceRegex.ReplaceAllString(data, "") + buf := strings.Builder{} + buf.Grow(len(data)) + for _, r := range data { + if !unicode.IsSpace(r) { + buf.WriteRune(r) + } + } + return buf.String() } // Perform compression based on algorithm