diff --git a/Makefile b/Makefile index fa77d89d..2bbfac31 100644 --- a/Makefile +++ b/Makefile @@ -16,12 +16,12 @@ test-cmd: test: $(MAKE) TESTOPTS=./... test-cmd $(MAKE) -f $(PWD)/Makefile -C examples test-cmd - $(MAKE) -f $(PWD)/Makefile -C bench test-cmd + $(MAKE) -f $(PWD)/Makefile -C bench/performance test-cmd cover-cmd: $(MAKE) test-cmd $(MAKE) -f $(PWD)/Makefile -C examples TESTOPTS= test-cmd - $(MAKE) -f $(PWD)/Makefile -C bench TESTOPTS= test-cmd + $(MAKE) -f $(PWD)/Makefile -C bench/performance TESTOPTS= test-cmd $(MAKE) -f $(PWD)/Makefile -C cmd/jwx TESTOPTS= test-cmd @# This is NOT cheating. tools to generate code, and tools to @# run tests don't need to be included in the final result. @@ -46,7 +46,7 @@ cover-all: smoke-cmd: $(MAKE) test-cmd $(MAKE) -f $(PWD)/Makefile -C examples test-cmd - $(MAKE) -f $(PWD)/Makefile -C bench test-cmd + $(MAKE) -f $(PWD)/Makefile -C bench/performance test-cmd $(MAKE) -f $(PWD)/Makefile -C cmd/jwx test-cmd smoke: @@ -79,7 +79,7 @@ imports: tidy: $(MAKE) tidy-cmd $(MAKE) -f $(PWD)/Makefile -C examples tidy-cmd - $(MAKE) -f $(PWD)/Makefile -C bench tidy-cmd + $(MAKE) -f $(PWD)/Makefile -C bench/performance tidy-cmd $(MAKE) -f $(PWD)/Makefile -C cmd/jwx tidy-cmd tidy-cmd: diff --git a/bench/README.md b/bench/README.md index d9f31da5..1e4f2a53 100644 --- a/bench/README.md +++ b/bench/README.md @@ -1,159 +1,9 @@ # Benchmarks -## Quick benchmark +# Performance Benchmarks -``` -go test -bench . -benchmem -``` +[Measures the performance of github.com/lestrrat-go/jwx](./performance) -## Full benchmark +# Comparison Benchmarks -``` -go test -timeout 60m -bench . -benchmem | tee stdlib.txt -``` - -## Switch JSON backends - -``` -go test -timeout 60m -tags jwx_goccy -bench . -benchmem | tee goccy.txt -``` - -## Comparison - -Go 1.6.2, github.com/goccy/go-json v0.7.4 - -``` -benchstat -sort -delta stdlib.txt goccy.txt -name old time/op new time/op delta -JWK/Serialization/RSA/PrivateKey/jwk.ParseString-24 75.1µs ± 3% 29.3µs ± 2% -60.98% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.Parse-24 73.3µs ± 1% 28.8µs ± 1% -60.65% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.ParseReader-24 75.2µs ± 0% 30.0µs ± 1% -60.09% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.ParseReader-24 29.6µs ± 2% 14.4µs ± 0% -51.38% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.ParseReader-24 39.1µs ± 2% 19.1µs ± 1% -51.13% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.Parse-24 28.7µs ± 1% 14.3µs ± 1% -50.09% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.Parse-24 38.6µs ± 5% 19.3µs ± 2% -49.90% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.ParseString-24 38.5µs ± 0% 19.3µs ± 2% -49.87% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.ParseString-24 28.8µs ± 1% 14.6µs ± 2% -49.35% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.Parse-24 26.5µs ± 0% 13.5µs ± 0% -49.00% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.ParseString-24 26.8µs ± 1% 13.7µs ± 1% -48.76% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.ParseReader-24 26.9µs ± 0% 14.0µs ± 1% -48.00% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.Parse-24 24.2µs ± 0% 12.7µs ± 2% -47.72% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.ParseString-24 24.4µs ± 0% 12.8µs ± 2% -47.64% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.ParseReader-24 24.5µs ± 0% 13.1µs ± 2% -46.70% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.Parse-24 19.0µs ± 1% 10.9µs ± 1% -42.51% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.ParseString-24 19.3µs ± 1% 11.3µs ± 3% -41.22% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.ParseString-24 19.2µs ± 1% 11.4µs ± 1% -40.63% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.ParseReader-24 19.4µs ± 1% 11.6µs ± 2% -40.34% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.Parse-24 18.9µs ± 2% 11.4µs ± 1% -39.91% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.ParseReader-24 19.3µs ± 1% 11.7µs ± 1% -39.59% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.Parse-24 21.6µs ± 2% 15.2µs ± 0% -29.84% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.Parse-24 11.1µs ± 1% 7.8µs ± 2% -29.51% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.ParseReader-24 11.7µs ± 2% 8.3µs ± 3% -29.22% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.ParseReader-24 21.8µs ± 1% 15.6µs ± 1% -28.58% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.ParseString-24 11.7µs ± 1% 8.3µs ± 2% -28.57% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.ParseString-24 21.8µs ± 1% 15.6µs ± 1% -28.25% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.Parse-24 14.6µs ± 1% 10.7µs ± 1% -26.92% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.ParseReader-24 14.9µs ± 1% 11.0µs ± 1% -26.36% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.ParseString-24 14.6µs ± 0% 10.8µs ± 2% -26.04% (p=0.016 n=4+5) -JWS/Serialization/JSON/json.Marshal-24 29.8µs ± 4% 28.3µs ± 2% -4.98% (p=0.016 n=5+5) -JWE/Serialization/JSON/json.Marshal-24 33.5µs ± 3% 34.4µs ± 1% ~ (p=0.056 n=5+5) -JWK/Serialization/EC/PublicKey/json.Marshal-24 14.7µs ± 5% 15.3µs ± 1% ~ (p=0.095 n=5+5) -JWK/Serialization/EC/PrivateKey/json.Marshal-24 16.0µs ± 5% 15.9µs ± 2% ~ (p=1.000 n=5+5) -JWT/Serialization/Sign/jwt.Sign-24 1.22ms ± 0% 1.22ms ± 1% ~ (p=0.690 n=5+5) -JWK/Serialization/RSA/PublicKey/json.Marshal-24 14.7µs ± 1% 15.0µs ± 1% +2.10% (p=0.016 n=5+5) -JWK/Serialization/RSA/PrivateKey/json.Marshal-24 27.9µs ± 1% 28.8µs ± 1% +3.13% (p=0.008 n=5+5) -JWT/Serialization/JSON/json.Unmarshal-24 4.80µs ± 0% 4.97µs ± 3% +3.62% (p=0.008 n=5+5) -JWT/Serialization/JSON/json.Marshal-24 11.0µs ± 1% 11.5µs ± 3% +4.19% (p=0.016 n=5+5) -JWK/Serialization/Symmetric/PublicKey/json.Marshal-24 12.1µs ± 2% 12.7µs ± 2% +4.68% (p=0.008 n=5+5) -JWE/Serialization/JSON/json.Unmarshal-24 8.86µs ± 0% 9.29µs ± 1% +4.84% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/json.Marshal-24 12.0µs ± 0% 12.9µs ± 4% +7.46% (p=0.008 n=5+5) - -name old alloc/op new alloc/op delta -JWT/Serialization/JSON/jwt.Parse-24 7.80kB ± 0% 3.48kB ± 0% -55.38% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.ParseString-24 7.85kB ± 0% 3.53kB ± 0% -55.05% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.ParseReader-24 8.31kB ± 0% 3.99kB ± 0% -51.97% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.Parse-24 10.8kB ± 0% 5.7kB ± 0% -47.68% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.ParseString-24 11.3kB ± 0% 6.1kB ± 0% -45.78% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.ParseReader-24 11.4kB ± 0% 6.2kB ± 0% -45.53% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.Parse-24 36.5kB ± 0% 26.0kB ± 0% -28.82% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.Parse-24 2.83kB ± 0% 2.02kB ± 0% -28.81% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.ParseString-24 38.3kB ± 0% 27.8kB ± 0% -27.47% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.ParseString-24 3.02kB ± 0% 2.21kB ± 0% -26.98% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.Parse-24 7.04kB ± 0% 5.15kB ± 0% -26.82% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.Parse-24 6.27kB ± 0% 4.64kB ± 0% -26.02% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.Parse-24 6.27kB ± 0% 4.64kB ± 0% -26.02% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.ParseString-24 7.28kB ± 0% 5.39kB ± 0% -25.93% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.ParseReader-24 41.1kB ± 0% 30.6kB ± 0% -25.58% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.ParseString-24 6.40kB ± 0% 4.77kB ± 0% -25.50% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.ParseString-24 6.40kB ± 0% 4.77kB ± 0% -25.50% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.ParseReader-24 7.55kB ± 0% 5.66kB ± 0% -25.00% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.Parse-24 16.3kB ± 0% 12.3kB ± 0% -24.65% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.ParseReader-24 3.34kB ± 0% 2.53kB ± 0% -24.40% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.Parse-24 7.65kB ± 0% 5.79kB ± 0% -24.27% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.ParseReader-24 6.78kB ± 0% 5.15kB ± 0% -24.06% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.ParseReader-24 6.78kB ± 0% 5.15kB ± 0% -24.06% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.ParseString-24 17.2kB ± 0% 13.2kB ± 0% -23.36% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.ParseString-24 8.00kB ± 0% 6.14kB ± 0% -23.20% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.ParseReader-24 8.16kB ± 0% 6.30kB ± 0% -22.75% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.ParseReader-24 17.9kB ± 0% 13.9kB ± 0% -22.52% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.Parse-24 7.22kB ± 0% 5.71kB ± 0% -20.84% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.ParseString-24 7.63kB ± 0% 6.13kB ± 0% -19.71% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.ParseReader-24 7.73kB ± 0% 6.22kB ± 0% -19.46% (p=0.008 n=5+5) -JWE/Serialization/JSON/json.Unmarshal-24 1.58kB ± 0% 1.58kB ± 0% ~ (all equal) -JWT/Serialization/Sign/jwt.Sign-24 36.6kB ± 0% 36.6kB ± 0% ~ (p=0.548 n=5+5) -JWT/Serialization/JSON/json.Unmarshal-24 592B ± 0% 592B ± 0% ~ (all equal) -JWE/Serialization/JSON/json.Marshal-24 3.98kB ± 0% 3.99kB ± 0% +0.24% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/json.Marshal-24 1.80kB ± 0% 1.80kB ± 0% +0.26% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/json.Marshal-24 1.16kB ± 0% 1.16kB ± 0% +0.26% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/json.Marshal-24 1.16kB ± 0% 1.16kB ± 0% +0.26% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/json.Marshal-24 8.85kB ± 0% 8.87kB ± 0% +0.27% (p=0.008 n=5+5) -JWT/Serialization/JSON/json.Marshal-24 722B ± 0% 724B ± 0% +0.28% (p=0.008 n=5+5) -JWS/Serialization/JSON/json.Marshal-24 5.18kB ± 0% 5.20kB ± 0% +0.28% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/json.Marshal-24 2.34kB ± 0% 2.35kB ± 0% +0.28% (p=0.016 n=5+4) -JWK/Serialization/EC/PrivateKey/json.Marshal-24 2.29kB ± 0% 2.29kB ± 0% +0.29% (p=0.016 n=4+5) - -name old allocs/op new allocs/op delta -JWK/Serialization/RSA/PrivateKey/jwk.Parse-24 205 ± 0% 89 ± 0% -56.59% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.ParseString-24 206 ± 0% 90 ± 0% -56.31% (p=0.008 n=5+5) -JWK/Serialization/RSA/PrivateKey/jwk.ParseReader-24 209 ± 0% 93 ± 0% -55.50% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.Parse-24 129 ± 0% 60 ± 0% -53.49% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.ParseString-24 130 ± 0% 61 ± 0% -53.08% (p=0.008 n=5+5) -JWK/Serialization/EC/PrivateKey/jwk.ParseReader-24 130 ± 0% 61 ± 0% -53.08% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.Parse-24 112 ± 0% 54 ± 0% -51.79% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.ParseString-24 113 ± 0% 55 ± 0% -51.33% (p=0.008 n=5+5) -JWK/Serialization/EC/PublicKey/jwk.ParseReader-24 113 ± 0% 55 ± 0% -51.33% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.Parse-24 96.0 ± 0% 50.0 ± 0% -47.92% (p=0.008 n=5+5) - -JWK/Serialization/RSA/PublicKey/jwk.ParseString-24 97.0 ± 0% 51.0 ± 0% -47.42% (p=0.008 n=5+5) -JWK/Serialization/RSA/PublicKey/jwk.ParseReader-24 97.0 ± 0% 51.0 ± 0% -47.42% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.Parse-24 49.0 ± 0% 27.0 ± 0% -44.90% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.ParseString-24 50.0 ± 0% 28.0 ± 0% -44.00% (p=0.008 n=5+5) -JWS/Serialization/Compact/jws.ParseReader-24 50.0 ± 0% 28.0 ± 0% -44.00% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.Parse-24 81.0 ± 0% 47.0 ± 0% -41.98% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.Parse-24 81.0 ± 0% 47.0 ± 0% -41.98% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.ParseString-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PublicKey/jwk.ParseReader-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.ParseString-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) -JWK/Serialization/Symmetric/PrivateKey/jwk.ParseReader-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.Parse-24 106 ± 0% 66 ± 0% -37.74% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.ParseString-24 107 ± 0% 67 ± 0% -37.38% (p=0.008 n=5+5) -JWT/Serialization/Sign/jwt.ParseReader-24 107 ± 0% 67 ± 0% -37.38% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.Parse-24 153 ± 0% 100 ± 0% -34.64% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.ParseString-24 154 ± 0% 101 ± 0% -34.42% (p=0.008 n=5+5) -JWS/Serialization/JSON/jws.ParseReader-24 155 ± 0% 102 ± 0% -34.19% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.Parse-24 57.0 ± 0% 39.0 ± 0% -31.58% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.ParseString-24 58.0 ± 0% 40.0 ± 0% -31.03% (p=0.008 n=5+5) -JWT/Serialization/JSON/jwt.ParseReader-24 58.0 ± 0% 40.0 ± 0% -31.03% (p=0.008 n=5+5) -JWE/Serialization/JSON/json.Marshal-24 45.0 ± 0% 45.0 ± 0% ~ (all equal) -JWE/Serialization/JSON/json.Unmarshal-24 26.0 ± 0% 26.0 ± 0% ~ (all equal) -JWK/Serialization/RSA/PublicKey/json.Marshal-24 24.0 ± 0% 24.0 ± 0% ~ (all equal) -JWK/Serialization/RSA/PrivateKey/json.Marshal-24 51.0 ± 0% 51.0 ± 0% ~ (all equal) -JWK/Serialization/EC/PublicKey/json.Marshal-24 27.0 ± 0% 27.0 ± 0% ~ (all equal) -JWK/Serialization/EC/PrivateKey/json.Marshal-24 31.0 ± 0% 31.0 ± 0% ~ (all equal) -JWK/Serialization/Symmetric/PublicKey/json.Marshal-24 20.0 ± 0% 20.0 ± 0% ~ (all equal) -JWK/Serialization/Symmetric/PrivateKey/json.Marshal-24 20.0 ± 0% 20.0 ± 0% ~ (all equal) -JWS/Serialization/JSON/json.Marshal-24 60.0 ± 0% 60.0 ± 0% ~ (all equal) -JWT/Serialization/Sign/jwt.Sign-24 199 ± 0% 199 ± 0% ~ (all equal) -JWT/Serialization/JSON/json.Unmarshal-24 10.0 ± 0% 10.0 ± 0% ~ (all equal) -JWT/Serialization/JSON/json.Marshal-24 18.0 ± 0% 18.0 ± 0% ~ (all equal) -``` +[Compares github.com/lestrrat-go/jwx with other libraries](./comparison) diff --git a/bench/Makefile b/bench/comparison/Makefile similarity index 100% rename from bench/Makefile rename to bench/comparison/Makefile diff --git a/bench/comparison/go.mod b/bench/comparison/go.mod new file mode 100644 index 00000000..68ae1091 --- /dev/null +++ b/bench/comparison/go.mod @@ -0,0 +1,11 @@ +module github.com/lestrrat-go/jwx/bench/comparison + +go 1.15 + +replace github.com/lestrrat-go/jwx => ../.. + +require ( + github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/lestrrat-go/jwx v1.2.5 + github.com/stretchr/testify v1.7.0 +) diff --git a/bench/comparison/go.sum b/bench/comparison/go.sum new file mode 100644 index 00000000..5b559036 --- /dev/null +++ b/bench/comparison/go.sum @@ -0,0 +1,70 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= +github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 h1:sgNeV1VRMDzs6rzyPpxyM0jp317hnwiq58Filgag2xw= +github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8= +github.com/goccy/go-json v0.7.4 h1:B44qRUFwz/vxPKPISQ1KhvzRi9kZ28RAf6YtjriBZ5k= +github.com/goccy/go-json v0.7.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/lestrrat-go/backoff/v2 v2.0.7 h1:i2SeK33aOFJlUNJZzf2IpXRBvqBBnaGXfY5Xaop/GsE= +github.com/lestrrat-go/backoff/v2 v2.0.7/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/codegen v1.0.0/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= +github.com/lestrrat-go/httpcc v1.0.0 h1:FszVC6cKfDvBKcJv646+lkh4GydQg2Z29scgUfkOpYc= +github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.5 h1:0Akd9qTHrla8eqCV54Z4wRVv54WI54dUHN5D2+mIayc= +github.com/lestrrat-go/jwx v1.2.5/go.mod h1:CAe9Z479rJwIYDR2DqWwMm9c+gCNoYB6+0wBxPkEh0Q= +github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/pdebug/v3 v3.0.1 h1:3G5sX/aw/TbMTtVc9U7IHBWRZtMvwvBziF1e4HoQtv8= +github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 h1:3wPMTskHO3+O6jqTEXyFcsnuxMQOqYSaHsDxcbUXpqA= +golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/bench/go.mod b/bench/go.mod deleted file mode 100644 index c58297d4..00000000 --- a/bench/go.mod +++ /dev/null @@ -1,7 +0,0 @@ -module github.com/lestrrat-go/jwx/bench - -go 1.15 - -replace github.com/lestrrat-go/jwx => ../ - -require github.com/lestrrat-go/jwx v0.0.0-00010101000000-000000000000 diff --git a/bench/performance/Makefile b/bench/performance/Makefile new file mode 100644 index 00000000..b7f7a6a9 --- /dev/null +++ b/bench/performance/Makefile @@ -0,0 +1,8 @@ +stdlib: + go test -bench . -benchmem -count 5 -timeout 60m | tee stdlib.txt + +goccy: + go test -bench . -benchmem -count 5 -timeout 60m -tags jwx_goccy | tee goccy.txt + +benchstat: + benchstat -sort -delta stdlib.txt goccy.txt diff --git a/bench/performance/README.md b/bench/performance/README.md new file mode 100644 index 00000000..d9f31da5 --- /dev/null +++ b/bench/performance/README.md @@ -0,0 +1,159 @@ +# Benchmarks + +## Quick benchmark + +``` +go test -bench . -benchmem +``` + +## Full benchmark + +``` +go test -timeout 60m -bench . -benchmem | tee stdlib.txt +``` + +## Switch JSON backends + +``` +go test -timeout 60m -tags jwx_goccy -bench . -benchmem | tee goccy.txt +``` + +## Comparison + +Go 1.6.2, github.com/goccy/go-json v0.7.4 + +``` +benchstat -sort -delta stdlib.txt goccy.txt +name old time/op new time/op delta +JWK/Serialization/RSA/PrivateKey/jwk.ParseString-24 75.1µs ± 3% 29.3µs ± 2% -60.98% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.Parse-24 73.3µs ± 1% 28.8µs ± 1% -60.65% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.ParseReader-24 75.2µs ± 0% 30.0µs ± 1% -60.09% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.ParseReader-24 29.6µs ± 2% 14.4µs ± 0% -51.38% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.ParseReader-24 39.1µs ± 2% 19.1µs ± 1% -51.13% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.Parse-24 28.7µs ± 1% 14.3µs ± 1% -50.09% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.Parse-24 38.6µs ± 5% 19.3µs ± 2% -49.90% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.ParseString-24 38.5µs ± 0% 19.3µs ± 2% -49.87% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.ParseString-24 28.8µs ± 1% 14.6µs ± 2% -49.35% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.Parse-24 26.5µs ± 0% 13.5µs ± 0% -49.00% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.ParseString-24 26.8µs ± 1% 13.7µs ± 1% -48.76% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.ParseReader-24 26.9µs ± 0% 14.0µs ± 1% -48.00% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.Parse-24 24.2µs ± 0% 12.7µs ± 2% -47.72% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.ParseString-24 24.4µs ± 0% 12.8µs ± 2% -47.64% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.ParseReader-24 24.5µs ± 0% 13.1µs ± 2% -46.70% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.Parse-24 19.0µs ± 1% 10.9µs ± 1% -42.51% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.ParseString-24 19.3µs ± 1% 11.3µs ± 3% -41.22% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.ParseString-24 19.2µs ± 1% 11.4µs ± 1% -40.63% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.ParseReader-24 19.4µs ± 1% 11.6µs ± 2% -40.34% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.Parse-24 18.9µs ± 2% 11.4µs ± 1% -39.91% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.ParseReader-24 19.3µs ± 1% 11.7µs ± 1% -39.59% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.Parse-24 21.6µs ± 2% 15.2µs ± 0% -29.84% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.Parse-24 11.1µs ± 1% 7.8µs ± 2% -29.51% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.ParseReader-24 11.7µs ± 2% 8.3µs ± 3% -29.22% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.ParseReader-24 21.8µs ± 1% 15.6µs ± 1% -28.58% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.ParseString-24 11.7µs ± 1% 8.3µs ± 2% -28.57% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.ParseString-24 21.8µs ± 1% 15.6µs ± 1% -28.25% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.Parse-24 14.6µs ± 1% 10.7µs ± 1% -26.92% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.ParseReader-24 14.9µs ± 1% 11.0µs ± 1% -26.36% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.ParseString-24 14.6µs ± 0% 10.8µs ± 2% -26.04% (p=0.016 n=4+5) +JWS/Serialization/JSON/json.Marshal-24 29.8µs ± 4% 28.3µs ± 2% -4.98% (p=0.016 n=5+5) +JWE/Serialization/JSON/json.Marshal-24 33.5µs ± 3% 34.4µs ± 1% ~ (p=0.056 n=5+5) +JWK/Serialization/EC/PublicKey/json.Marshal-24 14.7µs ± 5% 15.3µs ± 1% ~ (p=0.095 n=5+5) +JWK/Serialization/EC/PrivateKey/json.Marshal-24 16.0µs ± 5% 15.9µs ± 2% ~ (p=1.000 n=5+5) +JWT/Serialization/Sign/jwt.Sign-24 1.22ms ± 0% 1.22ms ± 1% ~ (p=0.690 n=5+5) +JWK/Serialization/RSA/PublicKey/json.Marshal-24 14.7µs ± 1% 15.0µs ± 1% +2.10% (p=0.016 n=5+5) +JWK/Serialization/RSA/PrivateKey/json.Marshal-24 27.9µs ± 1% 28.8µs ± 1% +3.13% (p=0.008 n=5+5) +JWT/Serialization/JSON/json.Unmarshal-24 4.80µs ± 0% 4.97µs ± 3% +3.62% (p=0.008 n=5+5) +JWT/Serialization/JSON/json.Marshal-24 11.0µs ± 1% 11.5µs ± 3% +4.19% (p=0.016 n=5+5) +JWK/Serialization/Symmetric/PublicKey/json.Marshal-24 12.1µs ± 2% 12.7µs ± 2% +4.68% (p=0.008 n=5+5) +JWE/Serialization/JSON/json.Unmarshal-24 8.86µs ± 0% 9.29µs ± 1% +4.84% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/json.Marshal-24 12.0µs ± 0% 12.9µs ± 4% +7.46% (p=0.008 n=5+5) + +name old alloc/op new alloc/op delta +JWT/Serialization/JSON/jwt.Parse-24 7.80kB ± 0% 3.48kB ± 0% -55.38% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.ParseString-24 7.85kB ± 0% 3.53kB ± 0% -55.05% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.ParseReader-24 8.31kB ± 0% 3.99kB ± 0% -51.97% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.Parse-24 10.8kB ± 0% 5.7kB ± 0% -47.68% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.ParseString-24 11.3kB ± 0% 6.1kB ± 0% -45.78% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.ParseReader-24 11.4kB ± 0% 6.2kB ± 0% -45.53% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.Parse-24 36.5kB ± 0% 26.0kB ± 0% -28.82% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.Parse-24 2.83kB ± 0% 2.02kB ± 0% -28.81% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.ParseString-24 38.3kB ± 0% 27.8kB ± 0% -27.47% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.ParseString-24 3.02kB ± 0% 2.21kB ± 0% -26.98% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.Parse-24 7.04kB ± 0% 5.15kB ± 0% -26.82% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.Parse-24 6.27kB ± 0% 4.64kB ± 0% -26.02% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.Parse-24 6.27kB ± 0% 4.64kB ± 0% -26.02% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.ParseString-24 7.28kB ± 0% 5.39kB ± 0% -25.93% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.ParseReader-24 41.1kB ± 0% 30.6kB ± 0% -25.58% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.ParseString-24 6.40kB ± 0% 4.77kB ± 0% -25.50% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.ParseString-24 6.40kB ± 0% 4.77kB ± 0% -25.50% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.ParseReader-24 7.55kB ± 0% 5.66kB ± 0% -25.00% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.Parse-24 16.3kB ± 0% 12.3kB ± 0% -24.65% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.ParseReader-24 3.34kB ± 0% 2.53kB ± 0% -24.40% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.Parse-24 7.65kB ± 0% 5.79kB ± 0% -24.27% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.ParseReader-24 6.78kB ± 0% 5.15kB ± 0% -24.06% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.ParseReader-24 6.78kB ± 0% 5.15kB ± 0% -24.06% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.ParseString-24 17.2kB ± 0% 13.2kB ± 0% -23.36% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.ParseString-24 8.00kB ± 0% 6.14kB ± 0% -23.20% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.ParseReader-24 8.16kB ± 0% 6.30kB ± 0% -22.75% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.ParseReader-24 17.9kB ± 0% 13.9kB ± 0% -22.52% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.Parse-24 7.22kB ± 0% 5.71kB ± 0% -20.84% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.ParseString-24 7.63kB ± 0% 6.13kB ± 0% -19.71% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.ParseReader-24 7.73kB ± 0% 6.22kB ± 0% -19.46% (p=0.008 n=5+5) +JWE/Serialization/JSON/json.Unmarshal-24 1.58kB ± 0% 1.58kB ± 0% ~ (all equal) +JWT/Serialization/Sign/jwt.Sign-24 36.6kB ± 0% 36.6kB ± 0% ~ (p=0.548 n=5+5) +JWT/Serialization/JSON/json.Unmarshal-24 592B ± 0% 592B ± 0% ~ (all equal) +JWE/Serialization/JSON/json.Marshal-24 3.98kB ± 0% 3.99kB ± 0% +0.24% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/json.Marshal-24 1.80kB ± 0% 1.80kB ± 0% +0.26% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/json.Marshal-24 1.16kB ± 0% 1.16kB ± 0% +0.26% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/json.Marshal-24 1.16kB ± 0% 1.16kB ± 0% +0.26% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/json.Marshal-24 8.85kB ± 0% 8.87kB ± 0% +0.27% (p=0.008 n=5+5) +JWT/Serialization/JSON/json.Marshal-24 722B ± 0% 724B ± 0% +0.28% (p=0.008 n=5+5) +JWS/Serialization/JSON/json.Marshal-24 5.18kB ± 0% 5.20kB ± 0% +0.28% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/json.Marshal-24 2.34kB ± 0% 2.35kB ± 0% +0.28% (p=0.016 n=5+4) +JWK/Serialization/EC/PrivateKey/json.Marshal-24 2.29kB ± 0% 2.29kB ± 0% +0.29% (p=0.016 n=4+5) + +name old allocs/op new allocs/op delta +JWK/Serialization/RSA/PrivateKey/jwk.Parse-24 205 ± 0% 89 ± 0% -56.59% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.ParseString-24 206 ± 0% 90 ± 0% -56.31% (p=0.008 n=5+5) +JWK/Serialization/RSA/PrivateKey/jwk.ParseReader-24 209 ± 0% 93 ± 0% -55.50% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.Parse-24 129 ± 0% 60 ± 0% -53.49% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.ParseString-24 130 ± 0% 61 ± 0% -53.08% (p=0.008 n=5+5) +JWK/Serialization/EC/PrivateKey/jwk.ParseReader-24 130 ± 0% 61 ± 0% -53.08% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.Parse-24 112 ± 0% 54 ± 0% -51.79% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.ParseString-24 113 ± 0% 55 ± 0% -51.33% (p=0.008 n=5+5) +JWK/Serialization/EC/PublicKey/jwk.ParseReader-24 113 ± 0% 55 ± 0% -51.33% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.Parse-24 96.0 ± 0% 50.0 ± 0% -47.92% (p=0.008 n=5+5) + +JWK/Serialization/RSA/PublicKey/jwk.ParseString-24 97.0 ± 0% 51.0 ± 0% -47.42% (p=0.008 n=5+5) +JWK/Serialization/RSA/PublicKey/jwk.ParseReader-24 97.0 ± 0% 51.0 ± 0% -47.42% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.Parse-24 49.0 ± 0% 27.0 ± 0% -44.90% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.ParseString-24 50.0 ± 0% 28.0 ± 0% -44.00% (p=0.008 n=5+5) +JWS/Serialization/Compact/jws.ParseReader-24 50.0 ± 0% 28.0 ± 0% -44.00% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.Parse-24 81.0 ± 0% 47.0 ± 0% -41.98% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.Parse-24 81.0 ± 0% 47.0 ± 0% -41.98% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.ParseString-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PublicKey/jwk.ParseReader-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.ParseString-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) +JWK/Serialization/Symmetric/PrivateKey/jwk.ParseReader-24 82.0 ± 0% 48.0 ± 0% -41.46% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.Parse-24 106 ± 0% 66 ± 0% -37.74% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.ParseString-24 107 ± 0% 67 ± 0% -37.38% (p=0.008 n=5+5) +JWT/Serialization/Sign/jwt.ParseReader-24 107 ± 0% 67 ± 0% -37.38% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.Parse-24 153 ± 0% 100 ± 0% -34.64% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.ParseString-24 154 ± 0% 101 ± 0% -34.42% (p=0.008 n=5+5) +JWS/Serialization/JSON/jws.ParseReader-24 155 ± 0% 102 ± 0% -34.19% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.Parse-24 57.0 ± 0% 39.0 ± 0% -31.58% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.ParseString-24 58.0 ± 0% 40.0 ± 0% -31.03% (p=0.008 n=5+5) +JWT/Serialization/JSON/jwt.ParseReader-24 58.0 ± 0% 40.0 ± 0% -31.03% (p=0.008 n=5+5) +JWE/Serialization/JSON/json.Marshal-24 45.0 ± 0% 45.0 ± 0% ~ (all equal) +JWE/Serialization/JSON/json.Unmarshal-24 26.0 ± 0% 26.0 ± 0% ~ (all equal) +JWK/Serialization/RSA/PublicKey/json.Marshal-24 24.0 ± 0% 24.0 ± 0% ~ (all equal) +JWK/Serialization/RSA/PrivateKey/json.Marshal-24 51.0 ± 0% 51.0 ± 0% ~ (all equal) +JWK/Serialization/EC/PublicKey/json.Marshal-24 27.0 ± 0% 27.0 ± 0% ~ (all equal) +JWK/Serialization/EC/PrivateKey/json.Marshal-24 31.0 ± 0% 31.0 ± 0% ~ (all equal) +JWK/Serialization/Symmetric/PublicKey/json.Marshal-24 20.0 ± 0% 20.0 ± 0% ~ (all equal) +JWK/Serialization/Symmetric/PrivateKey/json.Marshal-24 20.0 ± 0% 20.0 ± 0% ~ (all equal) +JWS/Serialization/JSON/json.Marshal-24 60.0 ± 0% 60.0 ± 0% ~ (all equal) +JWT/Serialization/Sign/jwt.Sign-24 199 ± 0% 199 ± 0% ~ (all equal) +JWT/Serialization/JSON/json.Unmarshal-24 10.0 ± 0% 10.0 ± 0% ~ (all equal) +JWT/Serialization/JSON/json.Marshal-24 18.0 ± 0% 18.0 ± 0% ~ (all equal) +``` diff --git a/bench/performance/go.mod b/bench/performance/go.mod new file mode 100644 index 00000000..ea2cdf07 --- /dev/null +++ b/bench/performance/go.mod @@ -0,0 +1,10 @@ +module github.com/lestrrat-go/jwx/bench/performance + +go 1.15 + +replace github.com/lestrrat-go/jwx => ../.. + +require ( + github.com/lestrrat-go/jwx v0.0.0-00010101000000-000000000000 + github.com/stretchr/testify v1.7.0 +) diff --git a/bench/go.sum b/bench/performance/go.sum similarity index 95% rename from bench/go.sum rename to bench/performance/go.sum index ad9be6a0..7170e238 100644 --- a/bench/go.sum +++ b/bench/performance/go.sum @@ -6,6 +6,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0 h1:sgNeV1VRMDzs6rzyPpxyM0jp317h github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8= github.com/goccy/go-json v0.7.4 h1:B44qRUFwz/vxPKPISQ1KhvzRi9kZ28RAf6YtjriBZ5k= github.com/goccy/go-json v0.7.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/lestrrat-go/backoff/v2 v2.0.7 h1:i2SeK33aOFJlUNJZzf2IpXRBvqBBnaGXfY5Xaop/GsE= github.com/lestrrat-go/backoff/v2 v2.0.7/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= @@ -15,11 +17,8 @@ github.com/lestrrat-go/httpcc v1.0.0 h1:FszVC6cKfDvBKcJv646+lkh4GydQg2Z29scgUfkO github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lestrrat-go/pdebug/v3 v3.0.1 h1:3G5sX/aw/TbMTtVc9U7IHBWRZtMvwvBziF1e4HoQtv8= -github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/bench/jwe_benchmark_test.go b/bench/performance/jwe_benchmark_test.go similarity index 100% rename from bench/jwe_benchmark_test.go rename to bench/performance/jwe_benchmark_test.go diff --git a/bench/jwk_benchmark_test.go b/bench/performance/jwk_benchmark_test.go similarity index 100% rename from bench/jwk_benchmark_test.go rename to bench/performance/jwk_benchmark_test.go diff --git a/bench/jws_benchmark_test.go b/bench/performance/jws_benchmark_test.go similarity index 100% rename from bench/jws_benchmark_test.go rename to bench/performance/jws_benchmark_test.go diff --git a/bench/jwt_benchmark_test.go b/bench/performance/jwt_benchmark_test.go similarity index 100% rename from bench/jwt_benchmark_test.go rename to bench/performance/jwt_benchmark_test.go diff --git a/bench/jwx_benchmark_test.go b/bench/performance/jwx_benchmark_test.go similarity index 100% rename from bench/jwx_benchmark_test.go rename to bench/performance/jwx_benchmark_test.go diff --git a/docs/README.md b/docs/README.md index cc55667a..fc2e9117 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ Here you will find bits and pieces of code explaining how to perform certain Javascript Object Signing and Encryption (JOSE) operations using https://github.com/lestrrat-go/jwx for Go. -Technical details: The code and command invocations in the following article was tested and run using github.com/lestrrat-go/jwx@v1.1.5 on go 1.16, MacBook Pro (M1, 2020) +Technical details: The code and command invocations in the following articles were tested and run using github.com/lestrrat-go/jwx@v1.1.5 on go 1.16, MacBook Pro (M1, 2020) # Index @@ -11,4 +11,5 @@ Technical details: The code and command invocations in the following article was * [Working with JWS](./02-jws.md) * Working with JWE (TODO) * [Working with JWK](./04-jwk.md) +* [Architecture and Design](./10-design.md) * [Frequently Asked Questions](./99-faq.md)