diff --git a/benchmarks/README.md b/benchmarks/README.md index f5ffeb6..611175a 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -5,53 +5,104 @@ Made with [mitata](https://github.com/evanwashere/mitata) library ## Signing +
+ HS256 + +## HS256 +``` +clk: ~3.18 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) + +benchmark avg (min … max) p75 / p99 (min … top 1%) +---------------------------------------------------- ------------------------------- +HS256 - jose (sync) 2.99 µs/iter 2.79 µs █ + (2.50 µs … 756.75 µs) 6.46 µs █ + (176.00 b … 975.45 kb) 2.93 kb ▁█▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + +HS256 - jsonwebtoken (sync) 2.95 µs/iter 2.83 µs █ + (2.58 µs … 534.75 µs) 6.00 µs █ + (352.00 b … 791.84 kb) 3.72 kb ▆█▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + +HS256 - jsonwebtoken (async) 3.60 µs/iter 3.65 µs ▃█▃ ▃ + (3.52 µs … 3.70 µs) 3.69 µs ▂▂▂ ███▇ ▂ ▂█▇ + (864.48 b … 3.09 kb) 2.85 kb ███▆▆████▆█▆▁▆▆▆███▆▆ + +HS256 - fast-jwt (sync) 2.09 µs/iter 2.18 µs █▃ + (1.97 µs … 2.26 µs) 2.24 µs ▂█ ██ ▂ ▂▂ + ( 1.48 kb … 1.50 kb) 1.49 kb ███▆██▅▃▁▁▁▁▁▅█▆▅████ + +HS256 - fast-jwt (async) 3.55 µs/iter 3.56 µs █ + (3.29 µs … 3.86 µs) 3.79 µs ▆█ + ( 3.44 kb … 3.55 kb) 3.52 kb ▂▁▁▁▁▁▁▁██▇█▄▁▅▁▁▁▁▄▂ + +HS256 - @node-rs/jsonwebtoken (sync) 2.65 µs/iter 2.66 µs ▆█ + (2.62 µs … 2.79 µs) 2.73 µs ▅██▂██▅▂ + ( 1.27 kb … 1.27 kb) 1.27 kb ▃▆████████▆▃▁▁▃▁▁▃▁▁▃ + +HS256 - @node-rs/jsonwebtoken (async) 9.63 µs/iter 9.79 µs █ + (7.67 µs … 217.17 µs) 15.25 µs ▂█▄▃ + ( 1.79 kb … 193.80 kb) 2.21 kb ▁▁▂████▂▁▁▁▁▁▁▁▁▁▁▁▁▁ + +summary + HS256 - fast-jwt (sync) + 1.27x faster than HS256 - @node-rs/jsonwebtoken (sync) + 1.41x faster than HS256 - jsonwebtoken (sync) + 1.43x faster than HS256 - jose (sync) + 1.7x faster than HS256 - fast-jwt (async) + 1.72x faster than HS256 - jsonwebtoken (async) + 4.61x faster than HS256 - @node-rs/jsonwebtoken (async) +``` +
+ +
HS512 ## HS512 ``` -clk: ~3.82 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.28 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ---------------------------------------------------- ------------------------------- -HS512 - jose (sync) 3.29 µs/iter 2.75 µs █ - (2.54 µs … 2.61 ms) 6.08 µs █ - (512.00 b … 1.03 mb) 2.97 kb ▅█▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +HS512 - jose (sync) 2.93 µs/iter 2.96 µs █ + (2.81 µs … 3.21 µs) 3.20 µs ▇ ▇█ ▄ + (801.16 b … 2.74 kb) 2.53 kb █▃▃▁▆████▅▁▃▅▃▃▁▃▁▁▁▃ -HS512 - jsonwebtoken (sync) 215.65 µs/iter 217.63 µs ▂█ - (206.17 µs … 493.79 µs) 250.21 µs ▄██▃█▃ - ( 5.55 kb … 788.38 kb) 8.87 kb ▁██████▆▃▂▂▂▁▁▁▁▁▁▁▁▁ +HS512 - jsonwebtoken (sync) 3.00 µs/iter 3.01 µs ██▃ + (2.91 µs … 3.15 µs) 3.14 µs ▇ ███▅ + ( 3.56 kb … 3.56 kb) 3.56 kb ▃▆█▆▃▃█████▁▁▁▃▁▁▃▁▁▆ -HS512 - jsonwebtoken (async) 212.88 µs/iter 212.75 µs █ - (204.54 µs … 338.88 µs) 245.46 µs █ - ( 5.73 kb … 574.96 kb) 6.23 kb ▂▃██▆▄▂▂▁▂▂▂▁▁▁▁▁▁▁▁▁ +HS512 - jsonwebtoken (async) 3.89 µs/iter 3.90 µs ▂ ▂█ + (3.82 µs … 4.07 µs) 4.03 µs █▇██ + ( 3.02 kb … 3.13 kb) 3.09 kb ▇▁▇▇████▄▇▇▁▁▁▄▁▁▄▁▁▄ -HS512 - fast-jwt (sync) 2.31 µs/iter 2.45 µs █ - (2.19 µs … 2.47 µs) 2.47 µs █▇ ▇▂ - ( 1.57 kb … 1.57 kb) 1.57 kb ▃███▁▁▁▁▁▁▁▁▁▁▁▁▁▂███ +HS512 - fast-jwt (sync) 2.49 µs/iter 2.56 µs ▅█ ▅ ▂ + (2.38 µs … 2.63 µs) 2.62 µs ██▅ ▇█ █▇▅ ▂▇ + ( 1.60 kb … 1.60 kb) 1.60 kb ███▇▇██▄▁▁▁▄▁███▄▇██▄ -HS512 - fast-jwt (async) 3.93 µs/iter 3.93 µs █ - (3.78 µs … 4.53 µs) 4.35 µs ▃█▃▃ - (700.39 b … 3.52 kb) 1.36 kb ████▅▃▃▁▁▅▁▃▁▃▁▃▃▁▁▃▃ +HS512 - fast-jwt (async) 3.95 µs/iter 3.99 µs ▂█▅ ▂ + (3.69 µs … 4.17 µs) 4.06 µs ███▂█▅ + ( 3.50 kb … 3.60 kb) 3.57 kb ▄▁▁▄▁▁▁▁▁▁▁▁██████▄▄▄ -HS512 - @node-rs/jsonwebtoken (sync) 2.80 µs/iter 2.79 µs █ - (2.62 µs … 123.29 µs) 3.29 µs ▃ █▃ - ( 1.33 kb … 97.41 kb) 1.38 kb ▁▃█▆██▄▃▁▅▅▂▁▁▁▁▁▁▁▁▁ +HS512 - @node-rs/jsonwebtoken (sync) 3.34 µs/iter 3.35 µs █▂ + (3.31 µs … 3.42 µs) 3.40 µs ▅▅▇▂▂ ██▂▂ + ( 1.30 kb … 1.31 kb) 1.31 kb █████▄████▇▄▁▄▄▄▁▁▁▁▄ -HS512 - @node-rs/jsonwebtoken (async) 12.04 µs/iter 12.88 µs █ - (8.13 µs … 127.04 µs) 14.46 µs ▄▂ ▇█▂ - ( 1.84 kb … 129.84 kb) 2.26 kb ▁▁▂▁▃▃▄▄▃██▄▇▆███▃▁▁▁ +HS512 - @node-rs/jsonwebtoken (async) 12.64 µs/iter 13.00 µs █▆▂ + (8.67 µs … 115.13 µs) 17.42 µs ████ + ( 1.83 kb … 193.84 kb) 2.25 kb ▁▁▁▁▁▄▆█████▃▃▂▁▁▁▁▁▁ summary HS512 - fast-jwt (sync) - 1.21x faster than HS512 - @node-rs/jsonwebtoken (sync) - 1.42x faster than HS512 - jose (sync) - 1.7x faster than HS512 - fast-jwt (async) - 5.21x faster than HS512 - @node-rs/jsonwebtoken (async) - 92.19x faster than HS512 - jsonwebtoken (async) - 93.39x faster than HS512 - jsonwebtoken (sync) + 1.18x faster than HS512 - jose (sync) + 1.21x faster than HS512 - jsonwebtoken (sync) + 1.34x faster than HS512 - @node-rs/jsonwebtoken (sync) + 1.57x faster than HS512 - jsonwebtoken (async) + 1.59x faster than HS512 - fast-jwt (async) + 5.08x faster than HS512 - @node-rs/jsonwebtoken (async) ```
@@ -61,48 +112,48 @@ summary ## ES512 ``` -clk: ~3.77 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.29 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ---------------------------------------------------- ------------------------------- -ES512 - jose (sync) 1.09 ms/iter 1.11 ms █ ▂ - (1.03 ms … 1.20 ms) 1.17 ms ▃█▄▂▃▅█ - ( 3.27 kb … 1.29 mb) 8.53 kb ▃▆█▇▇████████▄▄▂▂▃▁▂▁ +ES512 - jose (sync) 1.37 ms/iter 1.38 ms █ + (1.33 ms … 1.53 ms) 1.45 ms █ █▅ + ( 3.66 kb … 1.44 mb) 9.53 kb ▅█▇▄▄▄▃██▇▇▅▃▃▃▂▂▂▁▁▁ -ES512 - jsonwebtoken (sync) 1.37 ms/iter 1.39 ms █▄ ▂▇ - (1.34 ms … 1.55 ms) 1.41 ms ▇███▇ ██▇ - ( 6.05 kb … 55.27 kb) 7.75 kb ▁▁▅██████▆▄▄▆████▇▅▁▁ +ES512 - jsonwebtoken (sync) 1.38 ms/iter 1.39 ms ▂ ▄█ + (1.34 ms … 1.56 ms) 1.45 ms █▄ ███▃ + ( 6.02 kb … 24.08 kb) 7.12 kb ▅████▅▆█████▄▅▃▂▂▂▁▂▂ -ES512 - jsonwebtoken (async) 1.38 ms/iter 1.39 ms ▅ █▄ - (1.30 ms … 1.48 ms) 1.46 ms █▅ ██ - ( 6.52 kb … 2.25 mb) 16.67 kb ▂▂▂▁▂▁▄██▅▃██▆▃▂▂▁▂▂▂ +ES512 - jsonwebtoken (async) 1.37 ms/iter 1.36 ms █ + (1.34 ms … 2.51 ms) 1.54 ms ██▆ + ( 9.45 kb … 763.13 kb) 14.00 kb ███▆▃▂▂▂▂▂▃▁▁▂▁▁▁▁▁▁▁ -ES512 - fast-jwt (sync) 1.08 ms/iter 1.10 ms █ - (1.03 ms … 1.19 ms) 1.15 ms ▂▅▂█▃▆█▆█▄▇█▂ - ( 2.13 kb … 964.52 kb) 5.15 kb ▆█████████████▅▃▅▃▃▂▃ +ES512 - fast-jwt (sync) 1.38 ms/iter 1.39 ms █ + (1.33 ms … 2.12 ms) 1.58 ms ▄█▄ + ( 2.57 kb … 99.04 kb) 3.57 kb ███▆▃▂▃▃▂▄▄▂▂▂▂▁▂▁▁▁▁ -ES512 - fast-jwt (async) 1.32 ms/iter 1.34 ms ▆▇▅█ ▃▃ - (1.27 ms … 1.46 ms) 1.41 ms ▃ ███████▆ - ( 5.08 kb … 1.66 mb) 11.63 kb ▄▅██████████▄▂▆█▆▃▁▁▁ +ES512 - fast-jwt (async) 1.64 ms/iter 1.64 ms ▂█ + (1.57 ms … 1.96 ms) 1.94 ms ██▄ + ( 5.05 kb … 1.48 mb) 10.42 kb ███▄▃▂▂▃▃▃▂▂▁▂▁▂▂▂▃▂▂ -ES512 - @node-rs/jsonwebtoken (sync) 2.39 µs/iter 2.39 µs ▂█ - (2.37 µs … 2.50 µs) 2.50 µs ▃███ - ( 1.27 kb … 1.27 kb) 1.27 kb ████▆▇▅▁▁▂▁▂▁▁▂▁▁▁▁▁▂ +ES512 - @node-rs/jsonwebtoken (sync) 2.96 µs/iter 2.97 µs █ ▅▅▅▅ + (2.90 µs … 3.03 µs) 3.01 µs ███████ + ( 1.27 kb … 1.27 kb) 1.27 kb ▄▄▄█▁▁▄████████▄█▁▁▁▄ -ES512 - @node-rs/jsonwebtoken (async) 9.32 µs/iter 9.28 µs ▂ █ - (9.09 µs … 10.31 µs) 9.85 µs █ █▅ - ( 1.71 kb … 1.84 kb) 1.74 kb █▇██▁▇▇▁▁▁▇▁▁▁▁▁▁▁▁▁▇ +ES512 - @node-rs/jsonwebtoken (async) 11.10 µs/iter 12.71 µs █ + (8.29 µs … 168.33 µs) 17.29 µs ▄█▃ + ( 1.80 kb … 193.80 kb) 2.24 kb ▁▂▂███▂▁▁▁▄▇▄▂▂▁▁▁▁▁▁ summary ES512 - @node-rs/jsonwebtoken (sync) - 3.9x faster than ES512 - @node-rs/jsonwebtoken (async) - 451.18x faster than ES512 - fast-jwt (sync) - 454.82x faster than ES512 - jose (sync) - 554.33x faster than ES512 - fast-jwt (async) - 574.96x faster than ES512 - jsonwebtoken (sync) - 576.72x faster than ES512 - jsonwebtoken (async) + 3.75x faster than ES512 - @node-rs/jsonwebtoken (async) + 462.07x faster than ES512 - jsonwebtoken (async) + 463.55x faster than ES512 - jose (sync) + 464.51x faster than ES512 - jsonwebtoken (sync) + 466.29x faster than ES512 - fast-jwt (sync) + 552.88x faster than ES512 - fast-jwt (async) ``` @@ -112,48 +163,48 @@ summary ## RS512 ``` -clk: ~3.80 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.29 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ---------------------------------------------------- ------------------------------- -RS512 - jose (sync) 2.54 ms/iter 2.53 ms █ - (2.51 ms … 3.14 ms) 3.11 ms █▂ - ( 4.80 kb … 14.85 kb) 4.93 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂ +RS512 - jose (sync) 3.31 ms/iter 3.31 ms ▅█ + (3.26 ms … 4.06 ms) 4.02 ms ██ + ( 4.87 kb … 5.09 kb) 4.88 kb ██▇▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂ -RS512 - jsonwebtoken (sync) 3.40 ms/iter 3.40 ms █▆▂ - (3.36 ms … 3.59 ms) 3.54 ms ███▄ - ( 8.89 kb … 57.29 kb) 9.37 kb ▆████▆▃▂▂▂▁▁▁▁▁▁▁▁▁▁▂ +RS512 - jsonwebtoken (sync) 3.31 ms/iter 3.31 ms ▇█ + (3.26 ms … 4.06 ms) 4.01 ms ██ + ( 7.91 kb … 9.31 kb) 8.29 kb ██▅▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂ -RS512 - jsonwebtoken (async) 3.39 ms/iter 3.40 ms ▆▆█ - (3.37 ms … 3.54 ms) 3.46 ms ▅███▇ ▂ - ( 9.28 kb … 57.28 kb) 9.53 kb ▄████████▆▅▄▃▁▂▁▂▁▁▁▂ +RS512 - jsonwebtoken (async) 3.33 ms/iter 3.32 ms ▆█ + (3.26 ms … 4.13 ms) 4.03 ms ██▃ + ( 11.70 kb … 21.41 kb) 12.06 kb ███▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂ -RS512 - fast-jwt (sync) 2.54 ms/iter 2.53 ms █ - (2.51 ms … 3.15 ms) 3.12 ms █▂ - ( 4.41 kb … 7.91 kb) 4.45 kb ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +RS512 - fast-jwt (sync) 3.30 ms/iter 3.30 ms █▃ + (3.26 ms … 4.04 ms) 4.01 ms ██ + ( 4.41 kb … 7.91 kb) 4.48 kb ██▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -RS512 - fast-jwt (async) 3.52 ms/iter 3.55 ms ▅█ - (3.37 ms … 3.68 ms) 3.60 ms ▅██▅ - ( 9.85 kb … 291.22 kb) 11.55 kb ▁▄▂▄▂▁▁▂▁▂▁▂▇████▆▁▁▂ +RS512 - fast-jwt (async) 4.34 ms/iter 4.34 ms ▂▅█ + (4.27 ms … 4.74 ms) 4.66 ms ███ + ( 9.95 kb … 13.37 kb) 10.01 kb ▄████▇▂▄▂▁▁▃▂▂▂▁▁▁▂▁▃ -RS512 - @node-rs/jsonwebtoken (sync) 2.54 ms/iter 2.54 ms █ - (2.49 ms … 2.68 ms) 2.68 ms █▆ - ( 2.01 kb … 2.28 kb) 2.03 kb ▁▃▃▃██▆▃▂▂▁▁▁▁▁▁▂▁▁▂▁ +RS512 - @node-rs/jsonwebtoken (sync) 3.16 ms/iter 3.18 ms █▇█ ▅▃ + (3.13 ms … 3.31 ms) 3.25 ms ██████▆▆ + ( 2.02 kb … 2.27 kb) 2.02 kb █████████▇▆▇▅▄▃▄▁▂▃▁▂ -RS512 - @node-rs/jsonwebtoken (async) 2.48 ms/iter 2.54 ms █ - (2.44 ms … 2.59 ms) 2.58 ms █ - ( 2.63 kb … 2.95 kb) 2.63 kb ███▇▄▂▂▁▂▁▂▂▂▂▂▆▇▄▃▃▂ +RS512 - @node-rs/jsonwebtoken (async) 3.18 ms/iter 3.20 ms █ + (3.15 ms … 3.31 ms) 3.26 ms ▄██▆███▃▄▃▂ + ( 2.63 kb … 2.87 kb) 2.63 kb ███████████▄▇▃▇▂▂▃▃▃▂ summary - RS512 - @node-rs/jsonwebtoken (async) - 1.02x faster than RS512 - fast-jwt (sync) - 1.02x faster than RS512 - jose (sync) - 1.02x faster than RS512 - @node-rs/jsonwebtoken (sync) - 1.37x faster than RS512 - jsonwebtoken (async) - 1.37x faster than RS512 - jsonwebtoken (sync) - 1.42x faster than RS512 - fast-jwt (async) + RS512 - @node-rs/jsonwebtoken (sync) + 1.01x faster than RS512 - @node-rs/jsonwebtoken (async) + 1.04x faster than RS512 - fast-jwt (sync) + 1.05x faster than RS512 - jsonwebtoken (sync) + 1.05x faster than RS512 - jose (sync) + 1.05x faster than RS512 - jsonwebtoken (async) + 1.37x faster than RS512 - fast-jwt (async) ``` @@ -163,48 +214,48 @@ summary ## PS512 ``` -clk: ~3.81 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.28 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ---------------------------------------------------- ------------------------------- -PS512 - jose (sync) 2.62 ms/iter 2.68 ms █ - (2.52 ms … 3.33 ms) 3.14 ms █ - ( 4.91 kb … 6.01 kb) 4.95 kb ██▂▁▇█▅▄▂▁▁▃▁▂▁▁▁▁▁▁▂ +PS512 - jose (sync) 3.39 ms/iter 3.40 ms █ + (3.27 ms … 4.65 ms) 4.17 ms █▆ + ( 4.91 kb … 5.52 kb) 4.95 kb ███▇▆▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▂ -PS512 - jsonwebtoken (sync) 3.38 ms/iter 3.39 ms ▅█ - (3.35 ms … 3.54 ms) 3.43 ms ▂█▇███▅▂ - ( 7.88 kb … 56.47 kb) 9.16 kb ▅▇█████████▇▂▆▃▃▂▁▁▁▃ +PS512 - jsonwebtoken (sync) 3.41 ms/iter 3.40 ms █ + (3.26 ms … 5.73 ms) 4.63 ms █ + ( 6.97 kb … 9.31 kb) 8.16 kb ██▇▆▂▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁ -PS512 - jsonwebtoken (async) 3.53 ms/iter 3.55 ms █▅ - (3.38 ms … 3.61 ms) 3.58 ms ▂▆██ - ( 8.13 kb … 20.29 kb) 9.14 kb ▂▃▂▂▂▁▁▂▁▁▂▂▃▄█████▄▂ +PS512 - jsonwebtoken (async) 3.35 ms/iter 3.34 ms █ + (3.26 ms … 4.15 ms) 4.04 ms ▇█ + ( 10.45 kb … 59.93 kb) 12.68 kb ███▅▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▂ -PS512 - fast-jwt (sync) 2.56 ms/iter 2.54 ms █ - (2.52 ms … 3.13 ms) 3.11 ms █▂ - ( 3.75 kb … 38.49 kb) 4.56 kb ██▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂ +PS512 - fast-jwt (sync) 3.33 ms/iter 3.33 ms █ + (3.26 ms … 4.07 ms) 4.02 ms ▄█▃ + ( 3.89 kb … 53.63 kb) 4.72 kb ███▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -PS512 - fast-jwt (async) 3.37 ms/iter 3.38 ms ▅█▂ - (3.35 ms … 3.50 ms) 3.46 ms ▄▇███▂ - ( 9.13 kb … 1.16 mb) 15.69 kb ▃██████▇▅▃▃▄▁▁▁▃▂▁▁▁▂ +PS512 - fast-jwt (async) 4.32 ms/iter 4.34 ms ▄█ + (4.26 ms … 4.72 ms) 4.60 ms ███▄▂ + ( 9.15 kb … 41.28 kb) 10.15 kb ▅█████▇█▃▂▂▂▂▁▁▂▁▁▁▁▂ -PS512 - @node-rs/jsonwebtoken (sync) 2.44 ms/iter 2.44 ms █ - (2.43 ms … 2.72 ms) 2.59 ms █▃ - ( 2.02 kb … 2.28 kb) 2.03 kb ███▅▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +PS512 - @node-rs/jsonwebtoken (sync) 3.17 ms/iter 3.18 ms █ ▄ + (3.14 ms … 3.32 ms) 3.31 ms ███▆▂ + ( 2.02 kb … 2.09 kb) 2.02 kb ▆██████▇▃▁▁▂▁▁▂▁▁▁▁▁▂ -PS512 - @node-rs/jsonwebtoken (async) 2.59 ms/iter 2.61 ms █▄ - (2.45 ms … 2.84 ms) 2.79 ms ██▅ ▅ - ( 2.63 kb … 2.95 kb) 2.64 kb ▃▄▂▂▂▁█████▅▂▁▁▁▁▂▂▂▁ +PS512 - @node-rs/jsonwebtoken (async) 3.19 ms/iter 3.20 ms █▂ ▄ + (3.16 ms … 3.33 ms) 3.26 ms ██▇█▆ ▆▆ + ( 2.63 kb … 2.87 kb) 2.63 kb ███████████▇▇▃▆▃▅▁▁▁▃ summary PS512 - @node-rs/jsonwebtoken (sync) + 1.01x faster than PS512 - @node-rs/jsonwebtoken (async) 1.05x faster than PS512 - fast-jwt (sync) - 1.06x faster than PS512 - @node-rs/jsonwebtoken (async) + 1.05x faster than PS512 - jsonwebtoken (async) 1.07x faster than PS512 - jose (sync) - 1.38x faster than PS512 - fast-jwt (async) - 1.38x faster than PS512 - jsonwebtoken (sync) - 1.44x faster than PS512 - jsonwebtoken (async) + 1.07x faster than PS512 - jsonwebtoken (sync) + 1.36x faster than PS512 - fast-jwt (async) ``` @@ -214,38 +265,38 @@ summary ## EdDSA ``` -clk: ~3.82 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.29 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ---------------------------------------------------- ------------------------------- -EdDSA - jose (sync) 25.57 µs/iter 25.59 µs █ - (24.87 µs … 27.14 µs) 25.78 µs ██ █ - ( 3.18 kb … 3.18 kb) 3.18 kb █▁▁▁▁█▁▁▁▁▁▁███▁█▁▁▁█ +EdDSA - jose (sync) 30.39 µs/iter 29.89 µs █ + (29.35 µs … 37.81 µs) 30.10 µs ▅ ▅ ▅ █ ▅ ▅ ▅▅ ▅ ▅ + ( 3.23 kb … 3.23 kb) 3.23 kb █▁█▁▁█▁█▁▁█▁█▁██▁▁█▁█ -EdDSA - fast-jwt (sync) 25.15 µs/iter 25.42 µs █ █ - (24.43 µs … 25.91 µs) 25.87 µs █ █ █ - ( 1.89 kb … 1.89 kb) 1.89 kb █▁▁█▁▁▁█▁▁▁▁█▁█▁▁▁▁▁█ +EdDSA - fast-jwt (sync) 29.24 µs/iter 29.21 µs █ + (28.88 µs … 30.95 µs) 29.32 µs █ ▅ ▅▅▅▅▅ ▅▅ ▅ + ( 1.89 kb … 1.90 kb) 1.89 kb █▁▁█▁▁▁▁█████▁▁██▁▁▁█ -EdDSA - fast-jwt (async) 265.45 µs/iter 273.42 µs ▅█▆ - (251.46 µs … 335.13 µs) 289.17 µs ███▆ ▂ - ( 3.93 kb … 900.73 kb) 7.22 kb ▁▃█████▇▆▃▄▄▅██▇▅▂▂▂▁ +EdDSA - fast-jwt (async) 267.19 µs/iter 269.42 µs █ ▂ + (259.33 µs … 781.96 µs) 308.71 µs ███ + ( 4.05 kb … 661.27 kb) 6.61 kb ████▇▇▅▃▃▂▂▂▁▁▁▁▁▁▁▁▁ -EdDSA - @node-rs/jsonwebtoken (sync) 2.46 µs/iter 2.46 µs █ ▃█ - (2.44 µs … 2.51 µs) 2.51 µs ██▆████▆ - ( 1.27 kb … 1.27 kb) 1.27 kb █████████▄█▄▁▄▁▁▁▆▁▁▄ +EdDSA - @node-rs/jsonwebtoken (sync) 3.00 µs/iter 3.02 µs ██ + (2.93 µs … 3.06 µs) 3.05 µs ▅▂ ▂ ▂██▅▇ ▂ + ( 1.27 kb … 1.27 kb) 1.27 kb ▄██▄▇▄▄█▄▄▁▄█████▇▁█▄ -EdDSA - @node-rs/jsonwebtoken (async) 9.03 µs/iter 9.07 µs █ █ █ - (8.80 µs … 9.41 µs) 9.35 µs ▅ ▅▅█▅▅ █▅█ ▅ ▅ - ( 1.71 kb … 1.84 kb) 1.74 kb █▁█████▁███▁▁▁▁▁█▁▁▁█ +EdDSA - @node-rs/jsonwebtoken (async) 10.88 µs/iter 10.58 µs ▇█ + (8.33 µs … 130.92 µs) 17.63 µs ██ + ( 1.80 kb … 129.80 kb) 2.20 kb ▁▁▅██▇▂▂▁▁▃▄▄▃▂▂▁▁▁▁▁ summary EdDSA - @node-rs/jsonwebtoken (sync) - 3.68x faster than EdDSA - @node-rs/jsonwebtoken (async) - 10.24x faster than EdDSA - fast-jwt (sync) - 10.41x faster than EdDSA - jose (sync) - 108.07x faster than EdDSA - fast-jwt (async) + 3.63x faster than EdDSA - @node-rs/jsonwebtoken (async) + 9.76x faster than EdDSA - fast-jwt (sync) + 10.14x faster than EdDSA - jose (sync) + 89.14x faster than EdDSA - fast-jwt (async) ``` @@ -258,43 +309,43 @@ summary ## RS512 ``` -clk: ~3.77 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.26 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) ---------------------------------------------- ------------------------------- -RS512 - fast-jwt 954.83 ns/iter 915.65 ns █ - (875.42 ns … 3.81 µs) 2.16 µs █▅ - (181.47 b … 458.22 b) 456.27 b ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +RS512 - fast-jwt 1.10 µs/iter 1.11 µs █▃ + (1.06 µs … 1.17 µs) 1.15 µs ▂██▅ + (336.29 b … 458.22 b) 457.16 b ▃████▃▄████▆▄▃▃▃▂▃▃▂▃ -RS512 - fast-jwt (complete) 906.17 ns/iter 912.27 ns █ ▃ - (887.33 ns … 967.28 ns) 942.81 ns ▅███▃ - (366.35 b … 578.23 b) 576.75 b ▃▆█████▇███▆▆▃▃▁▂▃▃▃▃ +RS512 - fast-jwt (complete) 1.09 µs/iter 1.10 µs ▄█ + (1.06 µs … 1.18 µs) 1.16 µs ▇██▇▂ + (461.23 b … 578.24 b) 577.20 b ▇██████▆▇▆▅▅▇▄▅▃▂▂▁▁▂ -RS512 - jsonwebtoken 1.60 µs/iter 1.62 µs ▂█▃ - (1.50 µs … 1.64 µs) 1.64 µs ███ ▃ - (857.28 b … 867.15 b) 866.94 b ▂▁█▆▆▄▁▃▂▃▁▁▁▄█████▆▇ +RS512 - jsonwebtoken 1.86 µs/iter 1.86 µs ▄█ + (1.81 µs … 1.89 µs) 1.89 µs ▂███▄ + (857.28 b … 867.14 b) 866.93 b ▂▂▁▁▁▄▂▄▆█████▅▅▅▅█▄▂ -RS512 - jsonwebtoken (complete) 1.54 µs/iter 1.54 µs █ ▂ - (1.50 µs … 1.62 µs) 1.61 µs █▅██ - (858.64 b … 891.16 b) 874.72 b ▅▄▅████▇▇▇▃▂▂▂▁▁▁▁▂▁▂ +RS512 - jsonwebtoken (complete) 1.86 µs/iter 1.87 µs ███ █ + (1.81 µs … 1.90 µs) 1.90 µs ▅██████▅ ▅ + (858.54 b … 891.17 b) 871.30 b ▆▃▁▆▃▁█▃▆████████▃██▆ -RS512 - jose 729.27 ns/iter 739.02 ns ▅█ - (697.98 ns … 802.89 ns) 794.22 ns ▄██▄ ▃ - (426.12 b … 440.21 b) 435.68 b ▂██████▇█▆▄▄▇▃▆▅▃▂▂▂▂ +RS512 - jose 849.59 ns/iter 856.30 ns ▄█▅ + (820.44 ns … 891.41 ns) 889.56 ns ▇███▅ + (276.84 b … 426.25 b) 425.28 b ▂▃▂▃██████▅▅▇▇█▅▂▄▂▂▂ -RS512 - jose (complete) 755.40 ns/iter 761.68 ns ▆█ - (692.05 ns … 803.89 ns) 792.38 ns ▅▅██▂ - (414.52 b … 446.12 b) 439.48 b ▂▁▁▁▁▁▁▁▁▄██████▅▂▅▃▂ +RS512 - jose (complete) 880.87 ns/iter 887.38 ns ▄█▅ + (835.35 ns … 930.96 ns) 919.86 ns ▂▆███ + (414.49 b … 446.12 b) 438.27 b ▂▂▁▃▅▄▂▇█████▇▇▄▄▅▂▃▃ summary RS512 - jose 1.04x faster than RS512 - jose (complete) - 1.24x faster than RS512 - fast-jwt (complete) - 1.31x faster than RS512 - fast-jwt - 2.11x faster than RS512 - jsonwebtoken (complete) - 2.19x faster than RS512 - jsonwebtoken + 1.28x faster than RS512 - fast-jwt (complete) + 1.29x faster than RS512 - fast-jwt + 2.18x faster than RS512 - jsonwebtoken + 2.19x faster than RS512 - jsonwebtoken (complete) ``` @@ -304,53 +355,104 @@ Note that for decoding the algorithm is irrelevant, so only one was measured. ## Verifying +
+ HS256 + +## HS256 +``` +clk: ~3.28 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) + +benchmark avg (min … max) p75 / p99 (min … top 1%) +-------------------------------------------------- ------------------------------- +HS256 - fast-jwt (sync) 2.58 µs/iter 2.70 µs ▃█▆ + (2.48 µs … 2.86 µs) 2.81 µs ███ ▆ + ( 1.28 kb … 1.28 kb) 1.28 kb ███▃▁▁▁▁▁▃▃▁▁███▄▁▃▁▃ + +HS256 - fast-jwt (async) 4.76 µs/iter 4.76 µs █▅ ▅ + (4.40 µs … 5.40 µs) 5.35 µs ██▃█ + ( 3.48 kb … 3.59 kb) 3.55 kb ▄▁▁▁████▄▁▄█▁▄▁▁▄▄▁▁▄ + +HS256 - fast-jwt (sync with cache) 1.04 µs/iter 1.19 µs █ + (886.48 ns … 1.55 µs) 1.44 µs █ + (272.52 b … 1.87 kb) 1.00 kb ▇██▁▁▂▁▁▁▁▁▁▁▁▁▁▁▂█▅▂ + +HS256 - fast-jwt (async with cache) 1.15 µs/iter 1.29 µs █ ▅ + (987.19 ns … 1.51 µs) 1.43 µs █▄ ▃█ + ( 1.67 kb … 2.15 kb) 1.79 kb ▇██▃▂▂▂▁▁▁▁▁▆██▂▂▂▁▁▂ + +HS256 - jose (sync) 3.50 µs/iter 3.33 µs █ + (3.00 µs … 914.79 µs) 7.21 µs █ + (656.00 b … 467.17 kb) 2.34 kb ▁█▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + +HS256 - jsonwebtoken (sync) 3.82 µs/iter 3.81 µs █ + (3.72 µs … 4.02 µs) 4.00 µs ▅▂█▂ + ( 3.50 kb … 3.50 kb) 3.50 kb ▃▅▁▁████▃▁▅▃▃▁▁▁▁▁▃▁▃ + +HS256 - jsonwebtoken (async) 3.87 µs/iter 3.92 µs ▅ █ + (3.76 µs … 4.08 µs) 4.00 µs ▆ ▆█ █ █ + ( 97.51 b … 216.72 b) 185.62 b ▄▄▄▄█▁█████▄▁██▄▁▁▁▁█ + +summary + HS256 - fast-jwt (sync with cache) + 1.1x faster than HS256 - fast-jwt (async with cache) + 2.48x faster than HS256 - fast-jwt (sync) + 3.36x faster than HS256 - jose (sync) + 3.67x faster than HS256 - jsonwebtoken (sync) + 3.72x faster than HS256 - jsonwebtoken (async) + 4.57x faster than HS256 - fast-jwt (async) +``` +
+ +
HS512 ## HS512 ``` -clk: ~3.77 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.29 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) -------------------------------------------------- ------------------------------- -HS512 - fast-jwt (sync) 3.03 µs/iter 3.85 µs █ - (2.59 µs … 4.02 µs) 4.02 µs █ ▃ - ( 1.26 kb … 1.26 kb) 1.26 kb █▇▃▁▁▁▁▁▁▂▂▁▁▁▁▁▁▂█▃▂ +HS512 - fast-jwt (sync) 2.84 µs/iter 2.94 µs ▄▄ ▄ ▄ █ + (2.70 µs … 3.05 µs) 3.02 µs ████▅██ ▅█▅█ + ( 1.54 kb … 1.54 kb) 1.54 kb ███████▅▁▁▅▅▁██████▅▅ -HS512 - fast-jwt (async) 5.39 µs/iter 5.36 µs █ - (5.08 µs … 6.45 µs) 6.30 µs ▆█▃▃▃ - (823.31 b … 1.64 kb) 1.45 kb ██████▁▄▁▄▁▁▁▁▁▄▁▄▁▁▄ +HS512 - fast-jwt (async) 4.98 µs/iter 5.02 µs █ + (4.75 µs … 5.07 µs) 5.05 µs ▃█▆▃ ▆ + ( 3.36 kb … 3.47 kb) 3.43 kb ▄▁▄▁▁▁▁▁▁▁▁█▄█▁██████ -HS512 - fast-jwt (sync with cache) 1.13 µs/iter 953.03 ns █ - (887.26 ns … 1.97 µs) 1.95 µs █ - (723.44 b … 1.16 kb) 890.60 b █▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▆▃ +HS512 - fast-jwt (sync with cache) 1.21 µs/iter 1.15 µs ▂█ + (1.02 µs … 2.65 µs) 1.87 µs ██ + (666.24 b … 1.25 kb) 915.04 b ██▃▁▁▁▁▁▁▁▁▁▁▁▄█▃▁▁▁▁ -HS512 - fast-jwt (async with cache) 1.24 µs/iter 1.47 µs █ ▂ - (1.01 µs … 1.73 µs) 1.62 µs █▃ █ - ( 1.56 kb … 2.07 kb) 1.66 kb ██▇▃▁▃▂▁▁▁▁▂▁▁▂█▆▃▄▃▃ +HS512 - fast-jwt (async with cache) 1.30 µs/iter 1.47 µs █ + (1.14 µs … 1.54 µs) 1.53 µs ▃██ ▄▇ + ( 1.58 kb … 1.69 kb) 1.67 kb ████▁▃▁▁▁▁▁▁▁▁▁▃██▇▆▄ -HS512 - jose (sync) 3.34 µs/iter 3.04 µs █ - (2.79 µs … 2.89 ms) 4.46 µs ▂█▄ - (600.00 b … 621.12 kb) 2.32 kb ▁███▆▃▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁ +HS512 - jose (sync) 3.34 µs/iter 3.41 µs █ + (3.16 µs … 3.50 µs) 3.49 µs ▇▂ ▂█▅ + ( 2.14 kb … 2.14 kb) 2.14 kb ▃▁▃▆▁███▆▆▃▃▃▃███▃▃▁▃ -HS512 - jsonwebtoken (sync) 233.62 µs/iter 238.08 µs ▅█▇ - (214.42 µs … 467.25 µs) 250.33 µs ███▆ - ( 5.53 kb … 438.59 kb) 6.89 kb ▂▃▅▇█▇▆▃▄▅▅█████▅▃▂▂▁ +HS512 - jsonwebtoken (sync) 4.04 µs/iter 4.05 µs █ + (3.95 µs … 4.07 µs) 4.06 µs ▅▂▇█▅▅ + ( 3.69 kb … 3.69 kb) 3.69 kb ▄▁▄▁▁▁▁▄▁▁▁▄▇▇██████▇ -HS512 - jsonwebtoken (async) 220.80 µs/iter 223.33 µs ▃█ - (210.38 µs … 353.29 µs) 256.63 µs ███▂█▇ - ( 5.80 kb … 947.22 kb) 6.58 kb ▃██████▅▃▂▂▂▃▂▂▂▂▁▁▁▁ +HS512 - jsonwebtoken (async) 4.15 µs/iter 4.19 µs █ + (4.05 µs … 4.27 µs) 4.21 µs ██ ▇ + (302.09 b … 410.58 b) 377.66 b ▃▃▃▁▁▁▁▃▁▆██▃▁▁▁▃▆▆█▆ summary HS512 - fast-jwt (sync with cache) - 1.1x faster than HS512 - fast-jwt (async with cache) - 2.69x faster than HS512 - fast-jwt (sync) - 2.96x faster than HS512 - jose (sync) - 4.78x faster than HS512 - fast-jwt (async) - 195.52x faster than HS512 - jsonwebtoken (async) - 206.87x faster than HS512 - jsonwebtoken (sync) + 1.08x faster than HS512 - fast-jwt (async with cache) + 2.35x faster than HS512 - fast-jwt (sync) + 2.77x faster than HS512 - jose (sync) + 3.35x faster than HS512 - jsonwebtoken (sync) + 3.44x faster than HS512 - jsonwebtoken (async) + 4.13x faster than HS512 - fast-jwt (async) ```
@@ -360,48 +462,48 @@ summary ## ES512 ``` -clk: ~3.82 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.29 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) -------------------------------------------------- ------------------------------- -ES512 - fast-jwt (sync) 840.34 µs/iter 842.92 µs █ - (782.50 µs … 911.83 µs) 874.63 µs █▄ - ( 2.09 kb … 555.84 kb) 3.63 kb ▁▁▁▁▁▁▁▁▁▁▁▄██▆▃▂▂▁▁▁ +ES512 - fast-jwt (sync) 1.03 ms/iter 1.05 ms ▃█▄ + (998.71 µs … 1.19 ms) 1.17 ms ███▇▄▂ + ( 2.16 kb … 451.07 kb) 3.08 kb ██████▇▇▇▄▅▃▃▁▂▃▂▂▁▁▁ -ES512 - fast-jwt (async) 914.88 µs/iter 919.63 µs █▃ - (858.54 µs … 978.96 µs) 944.63 µs ██ - ( 4.27 kb … 836.84 kb) 7.44 kb ▁▁▁▁▁▃▃▂▂▁▁▁▃███▄▂▂▁▁ +ES512 - fast-jwt (async) 1.11 ms/iter 1.13 ms █▄▃█ + (1.07 ms … 1.25 ms) 1.22 ms ▃████▄▆▂ + ( 4.30 kb … 920.47 kb) 9.34 kb █████████▇▇▅▄▄▃▄▄▂▃▂▂ -ES512 - fast-jwt (sync with cache) 1.24 µs/iter 1.04 µs █▇ - (916.00 ns … 2.85 ms) 1.58 µs ██ - (912.00 b … 97.09 kb) 976.75 b ▁▃▁██▇▂▁▁▂▁▁▁▁▁▂▁▁▁▁▁ +ES512 - fast-jwt (sync with cache) 1.56 µs/iter 1.29 µs █ + (1.04 µs … 2.47 ms) 5.50 µs ▃█ + (952.00 b … 129.09 kb) 0.99 kb ██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -ES512 - fast-jwt (async with cache) 1.27 µs/iter 1.17 µs █ - (1.00 µs … 1.37 ms) 1.62 µs ▂█▅ - ( 1.66 kb … 129.66 kb) 1.99 kb ▁▁▁███▁▄▂▂▁▁▁▁▁▁▁▁▁▁▁ +ES512 - fast-jwt (async with cache) 1.60 µs/iter 1.42 µs █ + (1.17 µs … 1.65 ms) 4.79 µs ▄█ + ( 1.66 kb … 97.68 kb) 2.01 kb ██▆▄▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -ES512 - jose (sync) 843.36 µs/iter 845.21 µs █ - (786.50 µs … 935.50 µs) 893.42 µs █ - ( 2.40 kb … 851.24 kb) 3.66 kb ▁▁▁▁▁▁▁▁▁▂██▄▃▂▂▁▁▁▁▁ +ES512 - jose (sync) 1.12 ms/iter 1.06 ms █ + (1.00 ms … 5.01 ms) 3.78 ms █ + ( 2.46 kb … 835.04 kb) 4.66 kb █▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -ES512 - jsonwebtoken (sync) 934.94 µs/iter 938.50 µs █ - (870.75 µs … 1.12 ms) 994.54 µs █▇ - ( 4.48 kb … 707.00 kb) 5.93 kb ▁▁▁▂▁▂▂▁▁▂██▆▂▁▁▁▁▁▁▁ +ES512 - jsonwebtoken (sync) 1.04 ms/iter 1.05 ms █▃▄ + (1.00 ms … 1.18 ms) 1.15 ms ▅████▃▃ + ( 3.81 kb … 966.41 kb) 7.36 kb █████████▆▅▅▃▃▂▂▃▃▁▂▁ -ES512 - jsonwebtoken (async) 936.22 µs/iter 937.96 µs ▃█ - (926.92 µs … 1.01 ms) 966.63 µs ▃███▅ - ( 4.67 kb … 1.58 mb) 10.68 kb ▂██████▆▄▄▃▁▂▂▁▁▁▂▁▁▁ +ES512 - jsonwebtoken (async) 1.04 ms/iter 1.05 ms █▄ + (999.92 µs … 1.18 ms) 1.15 ms ▇████▅ + ( 4.34 kb … 524.85 kb) 5.13 kb █████████▅▅▅▃▂▃▃▃▃▂▂▂ summary ES512 - fast-jwt (sync with cache) 1.02x faster than ES512 - fast-jwt (async with cache) - 679.86x faster than ES512 - fast-jwt (sync) - 682.3x faster than ES512 - jose (sync) - 740.16x faster than ES512 - fast-jwt (async) - 756.4x faster than ES512 - jsonwebtoken (sync) - 757.43x faster than ES512 - jsonwebtoken (async) + 661.22x faster than ES512 - fast-jwt (sync) + 662.49x faster than ES512 - jsonwebtoken (async) + 663.03x faster than ES512 - jsonwebtoken (sync) + 708.82x faster than ES512 - fast-jwt (async) + 714.05x faster than ES512 - jose (sync) ``` @@ -411,48 +513,48 @@ summary ## RS512 ``` -clk: ~3.77 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.23 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) -------------------------------------------------- ------------------------------- -RS512 - fast-jwt (sync) 45.16 µs/iter 45.24 µs █ █ - (44.80 µs … 46.25 µs) 45.28 µs █▅ ▅ ▅ ▅ ▅ ▅█▅ - ( 1.80 kb … 1.81 kb) 1.80 kb ██▁█▁▁▁▁▁▁█▁▁█▁▁█▁███ +RS512 - fast-jwt (sync) 55.40 µs/iter 55.42 µs █ + (54.99 µs … 56.66 µs) 55.62 µs ▅▅ ▅▅ ▅▅ ▅▅▅ █ + ( 1.72 kb … 1.72 kb) 1.72 kb ██▁██▁▁▁▁██▁███▁▁▁▁▁█ -RS512 - fast-jwt (async) 128.43 µs/iter 132.04 µs █ - (119.79 µs … 191.54 µs) 144.88 µs █▆ ██ - ( 4.42 kb … 613.58 kb) 5.86 kb ▃███▅▄▂▂▄██▇▅▃▂▂▂▁▁▁▁ +RS512 - fast-jwt (async) 142.64 µs/iter 143.83 µs ▃█ + (134.67 µs … 1.01 ms) 186.33 µs ▇██▇ + ( 4.32 kb … 581.60 kb) 5.69 kb █████▆▅▃▂▂▁▁▁▁▁▁▁▁▁▁▁ -RS512 - fast-jwt (sync with cache) 1.51 µs/iter 1.32 µs █ - (1.26 µs … 2.37 µs) 2.34 µs █ - (888.29 b … 898.12 b) 897.84 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▆▄ +RS512 - fast-jwt (sync with cache) 1.83 µs/iter 1.76 µs ▂ █ + (1.50 µs … 2.49 µs) 2.49 µs ███▅ + (912.44 b … 1.00 kb) 923.07 b ▂▅████▃▁▁▁▁▁▁▁▁▂▂▃▆▆▆ -RS512 - fast-jwt (async with cache) 1.70 µs/iter 2.01 µs █ ▃ - (1.43 µs … 2.10 µs) 2.08 µs ▄█ █ - ( 1.56 kb … 1.67 kb) 1.65 kb ██▅▃▂▁▁▁▁▁▁▁▁▁▁▁▁▇█▄▂ +RS512 - fast-jwt (async with cache) 1.93 µs/iter 2.13 µs █ ▃▃ ▃ + (1.65 µs … 2.28 µs) 2.25 µs ▇█ ▂▂██▇ ██▅█ + ( 1.59 kb … 1.69 kb) 1.68 kb ██▃█████▃▁▁▁▆▆▆████▃▆ -RS512 - jose (sync) 42.96 µs/iter 42.83 µs █ - (41.75 µs … 1.23 ms) 51.63 µs █ - ( 2.29 kb … 304.27 kb) 3.17 kb ▆██▄▂▁▂▃▂▁▁▁▁▁▁▁▁▁▁▁▁ +RS512 - jose (sync) 56.10 µs/iter 56.79 µs █▅ + (53.04 µs … 860.38 µs) 75.58 µs ██ ▅ + ( 2.30 kb … 323.83 kb) 3.41 kb ██▅██▃▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁ -RS512 - jsonwebtoken (sync) 128.81 µs/iter 131.63 µs █ - (120.63 µs … 1.19 ms) 142.13 µs ▇▆ ██▃ - ( 7.33 kb … 869.80 kb) 9.95 kb ▂███▆▄▃▂▃███▅▄▂▂▂▂▂▁▁ +RS512 - jsonwebtoken (sync) 56.90 µs/iter 57.69 µs █ + (55.61 µs … 58.92 µs) 57.73 µs █ █ + ( 1.47 kb … 1.47 kb) 1.47 kb ████▁▁▁█▁▁▁▁▁▁▁▁█▁▁██ -RS512 - jsonwebtoken (async) 125.93 µs/iter 126.29 µs █ - (120.50 µs … 2.21 ms) 142.96 µs ██ - ( 1.14 kb … 165.64 kb) 8.58 kb ▂███▃▃▂▁▁▃▆▃▂▂▂▂▂▁▁▁▁ +RS512 - jsonwebtoken (async) 56.19 µs/iter 56.18 µs ██ █ + (55.66 µs … 57.92 µs) 56.76 µs ▅ ██ █ ▅▅ ▅ ▅ + (431.80 b … 439.38 b) 432.70 b █▁▁██▁█▁██▁█▁▁▁▁▁▁▁▁█ summary RS512 - fast-jwt (sync with cache) - 1.12x faster than RS512 - fast-jwt (async with cache) - 28.45x faster than RS512 - jose (sync) - 29.91x faster than RS512 - fast-jwt (sync) - 83.41x faster than RS512 - jsonwebtoken (async) - 85.06x faster than RS512 - fast-jwt (async) - 85.31x faster than RS512 - jsonwebtoken (sync) + 1.05x faster than RS512 - fast-jwt (async with cache) + 30.22x faster than RS512 - fast-jwt (sync) + 30.6x faster than RS512 - jose (sync) + 30.64x faster than RS512 - jsonwebtoken (async) + 31.03x faster than RS512 - jsonwebtoken (sync) + 77.79x faster than RS512 - fast-jwt (async) ``` @@ -462,48 +564,48 @@ summary ## PS512 ``` -clk: ~3.76 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.29 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) -------------------------------------------------- ------------------------------- -PS512 - fast-jwt (sync) 45.97 µs/iter 46.59 µs █ - (44.13 µs … 46.98 µs) 46.94 µs █ - ( 1.76 kb … 1.77 kb) 1.77 kb █▁█▁▁▁▁█▁▁██▁▁▁▁▁████ +PS512 - fast-jwt (sync) 55.21 µs/iter 55.37 µs █ + (54.69 µs … 56.85 µs) 55.52 µs ▅▅█ ▅ ▅ ▅ ▅ ▅ ▅ ▅ + ( 1.68 kb … 1.68 kb) 1.68 kb ███▁█▁▁█▁▁▁▁█▁█▁█▁█▁█ -PS512 - fast-jwt (async) 73.33 µs/iter 75.13 µs █ - (69.42 µs … 1.71 ms) 93.04 µs █ ▂ - ( 4.36 kb … 397.64 kb) 5.39 kb ▇██▄▃█▅▂▂▂▁▁▂▁▁▁▁▁▁▁▁ +PS512 - fast-jwt (async) 86.37 µs/iter 86.79 µs █ + (83.13 µs … 1.75 ms) 106.92 µs ▅█▃ + ( 4.05 kb … 529.27 kb) 5.52 kb ███▇▅▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁ -PS512 - fast-jwt (sync with cache) 1.48 µs/iter 1.28 µs █ - (1.22 µs … 2.36 µs) 2.34 µs ▅█ - (879.95 b … 889.60 b) 889.41 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▅▄ +PS512 - fast-jwt (sync with cache) 1.55 µs/iter 1.59 µs █ + (1.38 µs … 2.16 µs) 2.08 µs ██ + (904.31 b … 0.98 kb) 914.85 b ██▃▁▂▁▂▂▁▁▂▁▁▁▁▁▁▃█▃▂ -PS512 - fast-jwt (async with cache) 1.64 µs/iter 1.94 µs █ - (1.37 µs … 2.12 µs) 2.08 µs ▅█ ▅ - ( 1.56 kb … 1.66 kb) 1.65 kb ██▅▂▂▂▂▁▁▁▁▁▁▁▂▇█▅▅▂▂ +PS512 - fast-jwt (async with cache) 1.66 µs/iter 1.82 µs █ ▂ + (1.50 µs … 1.96 µs) 1.91 µs ██ █▃ + ( 1.58 kb … 1.69 kb) 1.67 kb ██▅▅▁▂▁▁▁▁▁▂▁▁▂██▅▁▄▂ -PS512 - jose (sync) 47.65 µs/iter 47.67 µs █ - (44.00 µs … 1.16 ms) 54.17 µs █▆ - (360.00 b … 355.05 kb) 3.35 kb ▁▁▁▁▁▇██▆▂▁▂▂▁▁▁▁▁▁▁▁ +PS512 - jose (sync) 56.25 µs/iter 55.88 µs ▅█ + (54.79 µs … 697.29 µs) 67.08 µs ██ + ( 2.19 kb … 355.05 kb) 3.45 kb ██▇▂▂▂▃▂▂▂▁▁▁▁▁▁▁▁▁▁▁ -PS512 - jsonwebtoken (sync) 74.37 µs/iter 75.54 µs ▅▃ █▃ - (69.21 µs … 3.01 ms) 83.58 µs ██ ██ - ( 1.30 kb … 546.25 kb) 9.40 kb ▂██▆▂▂▂▆███▄▃▃▂▁▁▁▁▁▁ +PS512 - jsonwebtoken (sync) 57.72 µs/iter 57.80 µs █ + (57.09 µs … 59.64 µs) 58.92 µs █ █ █ + ( 1.38 kb … 1.38 kb) 1.38 kb █▁████▁▁█▁▁▁▁▁▁▁▁▁▁▁█ -PS512 - jsonwebtoken (async) 71.80 µs/iter 70.88 µs ▂█ - (69.25 µs … 2.87 ms) 80.46 µs ██▅ - ( 8.40 kb … 393.91 kb) 8.87 kb ▂███▄▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁ +PS512 - jsonwebtoken (async) 58.79 µs/iter 57.85 µs █ █ + (57.22 µs … 71.55 µs) 58.67 µs █ ▅█▅ ▅▅ ▅▅ ▅ + (338.54 b … 339.49 b) 338.86 b █▁███▁██▁██▁▁▁▁▁▁▁▁▁█ summary PS512 - fast-jwt (sync with cache) - 1.11x faster than PS512 - fast-jwt (async with cache) - 31.09x faster than PS512 - fast-jwt (sync) - 32.22x faster than PS512 - jose (sync) - 48.56x faster than PS512 - jsonwebtoken (async) - 49.6x faster than PS512 - fast-jwt (async) - 50.3x faster than PS512 - jsonwebtoken (sync) + 1.07x faster than PS512 - fast-jwt (async with cache) + 35.55x faster than PS512 - fast-jwt (sync) + 36.22x faster than PS512 - jose (sync) + 37.17x faster than PS512 - jsonwebtoken (sync) + 37.86x faster than PS512 - jsonwebtoken (async) + 55.62x faster than PS512 - fast-jwt (async) ``` @@ -513,38 +615,38 @@ summary ## EdDSA ``` -clk: ~3.80 GHz -cpu: Apple M3 Pro -runtime: node 22.13.1 (arm64-darwin) +clk: ~3.30 GHz +cpu: Apple M2 Pro +runtime: node 22.11.0 (arm64-darwin) benchmark avg (min … max) p75 / p99 (min … top 1%) -------------------------------------------------- ------------------------------- -EdDSA - fast-jwt (sync) 66.87 µs/iter 66.58 µs █ - (65.83 µs … 101.29 µs) 78.25 µs ▇█ - ( 1.72 kb … 367.73 kb) 2.29 kb ██▄▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁ +EdDSA - fast-jwt (sync) 79.50 µs/iter 79.42 µs █ + (77.42 µs … 178.92 µs) 92.92 µs ██ + ( 1.63 kb … 400.78 kb) 2.45 kb ██▅▂▂▅▃▂▁▂▂▁▂▁▁▁▁▁▁▁▁ -EdDSA - fast-jwt (async) 109.31 µs/iter 109.50 µs █▆ - (106.54 µs … 204.38 µs) 123.17 µs ██ - ( 3.62 kb … 452.90 kb) 4.30 kb ▃███▅▅▃▂▂▁▃▃▂▁▁▁▁▁▁▁▁ +EdDSA - fast-jwt (async) 122.41 µs/iter 123.63 µs █ + (119.04 µs … 193.75 µs) 138.83 µs ▂█ + ( 3.53 kb … 580.81 kb) 4.51 kb ██▆▃▆▅▃▃▂▂▂▂▁▁▂▁▁▁▁▁▁ -EdDSA - fast-jwt (sync with cache) 1.23 µs/iter 1.78 µs ▃ █ - (944.07 ns … 1.95 µs) 1.94 µs █ █ - ( 1.04 kb … 1.04 kb) 1.04 kb █▆█▁▁▁▁▁▁▁▁▁▁▁▁▁▁█▂▇▂ +EdDSA - fast-jwt (sync with cache) 1.27 µs/iter 1.56 µs █ + (1.08 µs … 1.83 µs) 1.80 µs ▂█ + (733.41 b … 1.52 kb) 1.07 kb ███▁▂▂▁▂▁▁▁▁▁▂▅▇▄▂▁▁▁ -EdDSA - fast-jwt (async with cache) 1.32 µs/iter 1.55 µs █ - (1.06 µs … 1.74 µs) 1.72 µs ▆█ ▂█ - ( 1.73 kb … 1.84 kb) 1.83 kb ██▄▅▂▁▁▁▁▁▁▁▁▁██▆▄▄▂▂ +EdDSA - fast-jwt (async with cache) 1.55 µs/iter 1.61 µs █ ▄ + (1.21 µs … 3.33 µs) 3.17 µs █▅ █▂▂ + ( 1.75 kb … 1.86 kb) 1.84 kb ██▅███▅▃▂▁▁▃▁▁▂▁▂▂▁▁▂ -EdDSA - jose (sync) 67.21 µs/iter 67.04 µs █ - (66.17 µs … 112.92 µs) 78.42 µs █ - ( 2.20 kb … 469.91 kb) 3.05 kb ██▆▂▁▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +EdDSA - jose (sync) 81.76 µs/iter 82.25 µs █ + (77.92 µs … 594.29 µs) 108.92 µs █ + ( 2.15 kb … 482.91 kb) 3.17 kb █▇▇▇▃▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁ summary EdDSA - fast-jwt (sync with cache) - 1.08x faster than EdDSA - fast-jwt (async with cache) - 54.58x faster than EdDSA - fast-jwt (sync) - 54.87x faster than EdDSA - jose (sync) - 89.23x faster than EdDSA - fast-jwt (async) + 1.22x faster than EdDSA - fast-jwt (async with cache) + 62.78x faster than EdDSA - fast-jwt (sync) + 64.57x faster than EdDSA - jose (sync) + 96.68x faster than EdDSA - fast-jwt (async) ``` diff --git a/benchmarks/sign.mjs b/benchmarks/sign.mjs index b067c7b..2dceb98 100644 --- a/benchmarks/sign.mjs +++ b/benchmarks/sign.mjs @@ -4,7 +4,7 @@ import { privateKeys, publicKeys, compareSigning, saveLogs } from './utils.mjs' export async function runSuites() { const benchmarkResults = [] - for (const algorithm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) { + for (const algorithm of ['HS256', 'HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) { const result = await compareSigning({ a: 1, b: 2, c: 3 }, algorithm, privateKeys[algorithm], publicKeys[algorithm]) benchmarkResults.push({ algorithm, result }) } diff --git a/benchmarks/utils.mjs b/benchmarks/utils.mjs index 15afce8..8f0afac 100644 --- a/benchmarks/utils.mjs +++ b/benchmarks/utils.mjs @@ -2,6 +2,7 @@ import nodeRsJwt, { Algorithm } from '@node-rs/jsonwebtoken' import { run, bench, summary } from 'mitata' +import { createSecretKey, createPublicKey, createPrivateKey } from 'crypto' import { readFileSync } from 'fs' import { mkdir, writeFile } from 'fs/promises' import { dirname, resolve } from 'path' @@ -126,6 +127,28 @@ export function compareDecoding(token, algorithm) { return runMitata(tests, mitataOptions) } +function jsonwebtokenPrivateKeyFromString(privateKey) { + return jsonwebtokenKeyFromString(privateKey, createPrivateKey) +} + +function jsonwebtokenSecretKeyFromString(publicKey) { + return jsonwebtokenKeyFromString(publicKey, createSecretKey) +} + +function jsonwebtokenPublicKeyFromString(publicKey) { + return jsonwebtokenKeyFromString(publicKey, createPublicKey) +} + +function jsonwebtokenKeyFromString(key, keyFunc) { + const jsonwebtokenBuffer = Buffer.from(key) + const jwtSecretDataview = new DataView( + jsonwebtokenBuffer.buffer, + jsonwebtokenBuffer.byteOffset, + jsonwebtokenBuffer.byteLength + ) + return keyFunc(jwtSecretDataview) +} + export async function compareSigning(payload, algorithm, privateKey, publicKey) { const isEdDSA = algorithm.slice(0, 2) === 'Ed' @@ -134,6 +157,9 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey) const fastjwtVerify = createVerifier({ key: publicKey }) const josePrivateKey = asKey(privateKey) + const jsonwebtokenKey = /^(?:RS|PS|ES)/.test(algorithm) + ? jsonwebtokenPrivateKeyFromString(privateKey) + : jsonwebtokenSecretKeyFromString(publicKey) const joseOptions = { algorithm, iat: false, @@ -150,7 +176,7 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey) }) const jsonwebtokenGenerated = isEdDSA ? null - : jsonwebtokenSign(payload, privateKey, { algorithm, noTimestamp: true }) + : jsonwebtokenSign(payload, jsonwebtokenKey, { algorithm, noTimestamp: true }) log('-------') log(`Generated ${algorithm} tokens:`) @@ -162,7 +188,7 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey) log(`@node-rs/jsonwebtoken: ${JSON.stringify(nodeRsGenerated)}`) log('Generated tokens verification:') if (!isEdDSA) { - log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(jsonwebtokenGenerated, publicKey))}`) + log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(jsonwebtokenGenerated, jsonwebtokenKey))}`) } log(` jose: ${JSON.stringify(joseVerify(joseGenerated, asKey(publicKey)))}`) log(` fastjwt: ${JSON.stringify(fastjwtVerify(fastjwtGenerated))}`) @@ -181,10 +207,12 @@ export async function compareSigning(payload, algorithm, privateKey, publicKey) if (!isEdDSA) { Object.assign(tests, { [`${algorithm} - jsonwebtoken (sync)`]: function () { - jsonwebtokenSign(payload, privateKey, { algorithm, noTimestamp: true }) + jsonwebtokenSign(payload, jsonwebtokenKey, { algorithm, noTimestamp: true }) }, [`${algorithm} - jsonwebtoken (async)`]: async function () { - return new Promise(resolve => jsonwebtokenSign(payload, privateKey, { algorithm, noTimestamp: true }, resolve)) + return new Promise(resolve => + jsonwebtokenSign(payload, jsonwebtokenKey, { algorithm, noTimestamp: true }, resolve) + ) } }) } @@ -216,12 +244,15 @@ export function compareVerifying(token, algorithm, publicKey) { const fastjwtCachedVerifyAsync = createVerifier({ key: async () => publicKey, cache: true }) const josePublicKey = asKey(publicKey) + const jsonwebtokenKey = /^(?:RS|PS|ES)/.test(algorithm) + ? jsonwebtokenPublicKeyFromString(publicKey) + : jsonwebtokenSecretKeyFromString(publicKey) if ((process.env.NODE_DEBUG || '').includes('fast-jwt')) { log('-------') log(`Verified ${algorithm} tokens:`) if (!isEdDSA) { - log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(token, publicKey))}`) + log(` jsonwebtoken: ${JSON.stringify(jsonwebtokenVerify(token, jsonwebtokenKey))}`) } log(` jose: ${JSON.stringify(joseVerify(token, josePublicKey))}`) log(` fastjwt: ${JSON.stringify(fastjwtVerify(token))}`) @@ -250,10 +281,10 @@ export function compareVerifying(token, algorithm, publicKey) { if (!isEdDSA) { tests[`${algorithm} - jsonwebtoken (sync)`] = function () { - jsonwebtokenVerify(token, publicKey) + jsonwebtokenVerify(token, jsonwebtokenKey) } tests[`${algorithm} - jsonwebtoken (async)`] = async function () { - return new Promise(resolve => jsonwebtokenVerify(token, publicKey, resolve)) + return new Promise(resolve => jsonwebtokenVerify(token, jsonwebtokenKey, resolve)) } } diff --git a/benchmarks/verify.mjs b/benchmarks/verify.mjs index a3584a8..53b10c8 100644 --- a/benchmarks/verify.mjs +++ b/benchmarks/verify.mjs @@ -4,7 +4,7 @@ import { tokens, publicKeys, compareVerifying, saveLogs } from './utils.mjs' export async function runSuites() { const benchmarkResults = [] - for (const algorithm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) { + for (const algorithm of ['HS256', 'HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) { const result = await compareVerifying(tokens[algorithm], algorithm, publicKeys[algorithm]) benchmarkResults.push({ algorithm, result }) }