diff --git a/benchmarks/README.md b/benchmarks/README.md
index bf0848a..c5f83f4 100644
--- a/benchmarks/README.md
+++ b/benchmarks/README.md
@@ -2,454 +2,514 @@
## Signing
-```
-clk: ~3.77 GHz
+
+ HS512
+ ```
+ clk: ~3.82 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-HS512 - jose (sync) 3.40 µs/iter 2.83 µs █
- (2.54 µs … 2.92 ms) 7.04 µs █
- (512.00 b … 1.03 mb) 2.98 kb ▅█▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+HS512 - jose (sync) 3.29 µs/iter 2.75 µs █
+ (2.50 µs … 2.71 ms) 6.50 µs █
+ (376.00 b … 1.12 mb) 2.98 kb ▃█▃▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-HS512 - jsonwebtoken (sync) 215.96 µs/iter 216.17 µs ▇█
- (206.42 µs … 1.45 ms) 255.54 µs ██▄
- ( 5.55 kb … 873.49 kb) 8.90 kb ▂███▇▄▃▃▃▃▂▂▂▂▁▂▁▁▁▁▁
+HS512 - jsonwebtoken (sync) 221.11 µs/iter 228.13 µs ▃ █
+ (203.88 µs … 475.33 µs) 251.58 µs ███▇▅ ▅▅██
+ ( 6.11 kb … 905.44 kb) 9.51 kb ▃▆█████▇█████▅▃▂▂▂▂▁▁
-HS512 - jsonwebtoken (async) 216.60 µs/iter 218.17 µs ▆█▃▅
- (204.21 µs … 378.63 µs) 258.29 µs ████
- ( 8.85 kb … 694.75 kb) 13.55 kb ▂▆█████▄▃▃▂▂▂▂▂▂▂▁▁▁▁
+HS512 - jsonwebtoken (async) 213.75 µs/iter 215.08 µs ▅█▂
+ (205.63 µs … 1.03 ms) 246.71 µs ▄███▄
+ ( 2.31 kb … 765.81 kb) 14.88 kb ███████▄▃▂▂▂▂▁▁▁▁▁▁▁▁
-HS512 - fast-jwt (sync) 2.28 µs/iter 2.41 µs ▂█ ▂
- (2.13 µs … 2.54 µs) 2.54 µs ██ ▅█
- ( 1.57 kb … 1.57 kb) 1.57 kb ██▅▂▄█▅▁▁▁▁▁▁██▄▂▁▁▅▄
+HS512 - fast-jwt (sync) 2.42 µs/iter 2.58 µs █▂
+ (2.23 µs … 2.75 µs) 2.67 µs ██ █
+ ( 1.60 kb … 1.60 kb) 1.60 kb ▂▂▃██▂▂▁▁▂▁▁▃▁▃▇█▅▂▁▂
-HS512 - fast-jwt (async) 3.91 µs/iter 3.92 µs █
- (3.80 µs … 4.22 µs) 4.07 µs █ █ ███
- (113.49 b … 3.61 kb) 643.65 b ▅███▁███████▁▅▅█▁▅▁▁▅
+HS512 - fast-jwt (async) 4.32 µs/iter 4.40 µs █
+ (4.11 µs … 4.83 µs) 4.49 µs █▅ ▅ █ ▅
+ (444.30 b … 589.29 b) 515.42 b ▅████▅▁▅▅▁▅▅▅███▁█▁█▅
-HS512 - @node-rs/jsonwebtoken (sync) 2.82 µs/iter 2.83 µs █
- (2.79 µs … 2.86 µs) 2.86 µs █▂▂▂▅ ▂▇▂▅ ▂
- ( 1.31 kb … 1.31 kb) 1.31 kb ▄▇█████▇████▇▇█▇▄▇▄▄▄
+HS512 - @node-rs/jsonwebtoken (sync) 2.78 µs/iter 2.79 µs ▃█
+ (2.58 µs … 71.46 µs) 3.13 µs ██ ▄
+ ( 1.34 kb … 129.41 kb) 1.38 kb ▁▁▁▅▁██▁█▅▁▃▄▁▄▂▁▁▁▁▁
-HS512 - @node-rs/jsonwebtoken (async) 12.41 µs/iter 12.41 µs █ █
- (12.36 µs … 12.49 µs) 12.43 µs ▅ █ █ ▅▅▅ ▅
- ( 2.20 kb … 2.32 kb) 2.23 kb █▁▁█▁▁▁▁▁▁▁▁█▁▁███▁▁█
+HS512 - @node-rs/jsonwebtoken (async) 10.70 µs/iter 10.96 µs █
+ (8.71 µs … 149.42 µs) 15.00 µs ▆▃ ▃█
+ ( 3.02 kb … 131.04 kb) 3.29 kb ▁▄█████▆▃▃▇▃▃▅▄▂▁▁▁▁▁
summary
HS512 - fast-jwt (sync)
- 1.24x faster than HS512 - @node-rs/jsonwebtoken (sync)
- 1.5x faster than HS512 - jose (sync)
- 1.72x faster than HS512 - fast-jwt (async)
- 5.45x faster than HS512 - @node-rs/jsonwebtoken (async)
- 94.87x faster than HS512 - jsonwebtoken (sync)
- 95.16x faster than HS512 - jsonwebtoken (async)
-clk: ~3.81 GHz
+ 1.15x faster than HS512 - @node-rs/jsonwebtoken (sync)
+ 1.36x faster than HS512 - jose (sync)
+ 1.78x faster than HS512 - fast-jwt (async)
+ 4.42x faster than HS512 - @node-rs/jsonwebtoken (async)
+ 88.27x faster than HS512 - jsonwebtoken (async)
+ 91.31x faster than HS512 - jsonwebtoken (sync)
+ ```
+
+
+
+ ES512
+ ```
+ clk: ~3.78 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-ES512 - jose (sync) 1.19 ms/iter 1.19 ms ▃█
- (1.10 ms … 1.40 ms) 1.29 ms ██
- ( 3.27 kb … 1.32 mb) 9.44 kb ▂▁▁▁▁▁▁▁██▆▃▃▃▁▁▂▁▁▁▁
+ES512 - jose (sync) 1.10 ms/iter 1.10 ms █
+ (1.03 ms … 1.20 ms) 1.18 ms ▂█
+ ( 3.27 kb … 1.20 mb) 7.68 kb ▁▁▁▁▁▁███▄▃▄▃▃▂▂▂▂▂▁▁
-ES512 - jsonwebtoken (sync) 1.44 ms/iter 1.44 ms █▆
- (1.37 ms … 1.75 ms) 1.57 ms ██
- ( 6.36 kb … 55.21 kb) 7.81 kb ▂▁▆█▆▆██▇▃▄▄▂▂▂▁▂▂▁▁▁
+ES512 - jsonwebtoken (sync) 1.38 ms/iter 1.38 ms █▅
+ (1.30 ms … 1.63 ms) 1.46 ms ██
+ ( 6.46 kb … 55.28 kb) 7.83 kb ▁▁▁▁▂▂▂▅███▄▃▂▂▂▁▁▁▁▁
-ES512 - jsonwebtoken (async) 1.47 ms/iter 1.48 ms █
- (1.38 ms … 1.58 ms) 1.50 ms ▃██
- ( 9.82 kb … 701.87 kb) 14.89 kb ▁▂▁▁▁▁▁▁▁▄▄▂▂▂███▇▄▂▁
+ES512 - jsonwebtoken (async) 1.38 ms/iter 1.38 ms ██
+ (1.32 ms … 1.46 ms) 1.42 ms ▅██▅
+ ( 10.27 kb … 1.36 mb) 21.98 kb ▁▁▁▁▂▂▁▂▁▄█████▆▁▂▃▂▁
-ES512 - fast-jwt (sync) 1.19 ms/iter 1.21 ms █ ▆▄
- (1.10 ms … 1.45 ms) 1.39 ms ▂████
- ( 2.34 kb … 1.00 mb) 6.21 kb ▄██████▅▄▄▄▄▆▆▃▃▄▃▂▂▁
+ES512 - fast-jwt (sync) 1.09 ms/iter 1.09 ms █
+ (1.08 ms … 1.24 ms) 1.13 ms ▆██
+ ( 2.26 kb … 964.34 kb) 5.80 kb ▂███▆▆▅▃▂▂▁▂▂▁▁▁▁▁▁▁▁
-ES512 - fast-jwt (async) 1.45 ms/iter 1.45 ms █
- (1.37 ms … 1.83 ms) 1.55 ms █▃
- ( 5.09 kb … 1.27 mb) 8.42 kb ▁▁▁▁▂▂▂▅██▄▁▁▁▁▁▁▂▁▁▁
+ES512 - fast-jwt (async) 1.38 ms/iter 1.40 ms █
+ (1.27 ms … 1.69 ms) 1.55 ms ▆█
+ ( 5.48 kb … 1.37 mb) 11.55 kb ▂▁▁▃▃████▆▄▄▅▃▃▂▁▁▁▂▁
-ES512 - @node-rs/jsonwebtoken (sync) 2.47 µs/iter 2.48 µs █ █
- (2.44 µs … 2.59 µs) 2.59 µs █████
- ( 1.27 kb … 1.27 kb) 1.27 kb ██████▇▅█▁▁▁▁▅▁▁▁▁▁▁▅
+ES512 - @node-rs/jsonwebtoken (sync) 2.60 µs/iter 2.64 µs ▅ █▅
+ (2.49 µs … 2.78 µs) 2.75 µs █▇██▂▇ ▅ ▅
+ ( 1.27 kb … 1.27 kb) 1.27 kb ▄▁██████▇█▇█▇▇▇▄▄▄▄▄▇
-ES512 - @node-rs/jsonwebtoken (async) 9.38 µs/iter 9.39 µs █
- (9.23 µs … 9.68 µs) 9.60 µs ▂ █
- ( 2.17 kb … 2.27 kb) 2.19 kb ▆▆▁█▁▆▆▁█▆▁▆▁▁▁▁▁▁▁▁▆
+ES512 - @node-rs/jsonwebtoken (async) 12.08 µs/iter 12.83 µs █ ▄
+ (8.25 µs … 163.33 µs) 16.58 µs █▆ █
+ ( 2.98 kb … 163.00 kb) 3.25 kb ▁▂▂▃▆██▇████▇▇▅▂▂▂▁▁▁
summary
ES512 - @node-rs/jsonwebtoken (sync)
- 3.79x faster than ES512 - @node-rs/jsonwebtoken (async)
- 480.99x faster than ES512 - jose (sync)
- 482.05x faster than ES512 - fast-jwt (sync)
- 581.62x faster than ES512 - jsonwebtoken (sync)
- 586.21x faster than ES512 - fast-jwt (async)
- 593.4x faster than ES512 - jsonwebtoken (async)
-clk: ~3.81 GHz
+ 4.65x faster than ES512 - @node-rs/jsonwebtoken (async)
+ 418.78x faster than ES512 - fast-jwt (sync)
+ 422.64x faster than ES512 - jose (sync)
+ 530.58x faster than ES512 - jsonwebtoken (sync)
+ 531.48x faster than ES512 - fast-jwt (async)
+ 531.78x faster than ES512 - jsonwebtoken (async)
+ ```
+
+
+
+ RS512
+ ```
+ clk: ~3.75 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-RS512 - jose (sync) 2.70 ms/iter 2.71 ms █
- (2.53 ms … 3.33 ms) 3.31 ms █▄
- ( 4.82 kb … 13.74 kb) 4.91 kb ▄▃▂▃██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
+RS512 - jose (sync) 2.74 ms/iter 2.76 ms █
+ (2.61 ms … 3.37 ms) 3.32 ms ▄ █▄
+ ( 4.80 kb … 13.74 kb) 4.94 kb ▂█▇██▅▄▂▁▁▁▁▁▁▁▁▁▁▁▂▁
-RS512 - jsonwebtoken (sync) 3.55 ms/iter 3.57 ms █▂
- (3.39 ms … 3.65 ms) 3.63 ms ██
- ( 8.88 kb … 16.13 kb) 9.20 kb ▂▂▃▂▁▁▁▁▁▁▁▁▂███▆▇▃▂▁
+RS512 - jsonwebtoken (sync) 3.70 ms/iter 3.72 ms █
+ (3.48 ms … 5.32 ms) 5.00 ms ▇█
+ ( 8.89 kb … 9.81 kb) 9.20 kb ▆██▇▇▄▂▁▁▁▂▁▁▁▂▁▁▁▁▁▁
-RS512 - jsonwebtoken (async) 3.46 ms/iter 3.44 ms █
- (3.37 ms … 4.09 ms) 3.85 ms ▃█▂
- ( 12.81 kb … 61.19 kb) 13.59 kb ███▃▂▂▂▁▂▂▁▂▂▃▂▂▂▂▂▁▂
+RS512 - jsonwebtoken (async) 3.63 ms/iter 3.64 ms █
+ (3.48 ms … 3.76 ms) 3.68 ms ▆█▅
+ ( 13.41 kb … 61.78 kb) 14.22 kb ▁▁▁▂▂▁▁▁▁▁▁▁▁████▅▃▁▂
-RS512 - fast-jwt (sync) 2.72 ms/iter 2.71 ms █
- (2.64 ms … 3.30 ms) 3.28 ms █
- ( 4.41 kb … 52.62 kb) 4.63 kb ▂▄█▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+RS512 - fast-jwt (sync) 2.70 ms/iter 2.71 ms █
+ (2.57 ms … 3.31 ms) 3.29 ms ▄█
+ ( 4.41 kb … 7.91 kb) 4.47 kb ▂▃▄██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-RS512 - fast-jwt (async) 3.55 ms/iter 3.59 ms ▆▇▅█▅
- (3.37 ms … 3.64 ms) 3.63 ms █████
- ( 9.77 kb … 16.04 kb) 10.00 kb ▂▆▄▂▂▃▂▁▁▁▂▁▄█████▆▂▂
+RS512 - fast-jwt (async) 3.57 ms/iter 3.61 ms █
+ (3.49 ms … 3.92 ms) 3.87 ms ███ ▆
+ ( 10.55 kb … 15.80 kb) 10.64 kb ▇███▇▂▃█▅▃▁▁▂▁▂▁▂▁▁▁▁
-RS512 - @node-rs/jsonwebtoken (sync) 2.44 ms/iter 2.44 ms ▇█
- (2.42 ms … 2.50 ms) 2.48 ms ██▅▃
- ( 2.02 kb … 2.28 kb) 2.03 kb ▇█████▆▇▆▃▂▄▂▂▁▂▁▁▁▁▁
+RS512 - @node-rs/jsonwebtoken (sync) 2.65 ms/iter 2.66 ms █ ▇
+ (2.46 ms … 2.90 ms) 2.84 ms █ █▅
+ ( 2.02 kb … 2.28 kb) 2.03 kb ▁▁▁▂▁▃▃▇█▆██▅▅▆▂▂▁▁▂▂
-RS512 - @node-rs/jsonwebtoken (async) 2.46 ms/iter 2.46 ms █▂
- (2.44 ms … 2.63 ms) 2.62 ms ██▆
- ( 3.05 kb … 3.11 kb) 3.06 kb ███▃▂▂▂▁▁▁▁▁▁▁▂▁▁▁▁▁▁
+RS512 - @node-rs/jsonwebtoken (async) 2.63 ms/iter 2.67 ms ██
+ (2.44 ms … 3.03 ms) 2.93 ms ██▇▇
+ ( 3.66 kb … 3.71 kb) 3.66 kb ▆▇▆▅█▆▃████▁▂▁▃▂▃▂▁▂▂
summary
- RS512 - @node-rs/jsonwebtoken (sync)
- 1.01x faster than RS512 - @node-rs/jsonwebtoken (async)
- 1.11x faster than RS512 - jose (sync)
- 1.12x faster than RS512 - fast-jwt (sync)
- 1.42x faster than RS512 - jsonwebtoken (async)
- 1.46x faster than RS512 - jsonwebtoken (sync)
- 1.46x faster than RS512 - fast-jwt (async)
-clk: ~3.82 GHz
+ RS512 - @node-rs/jsonwebtoken (async)
+ 1.01x faster than RS512 - @node-rs/jsonwebtoken (sync)
+ 1.03x faster than RS512 - fast-jwt (sync)
+ 1.04x faster than RS512 - jose (sync)
+ 1.36x faster than RS512 - fast-jwt (async)
+ 1.38x faster than RS512 - jsonwebtoken (async)
+ 1.41x faster than RS512 - jsonwebtoken (sync)
+ ```
+
+
+
+ PS512
+ ```
+ clk: ~3.68 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-PS512 - jose (sync) 2.57 ms/iter 2.58 ms ▃█▃
- (2.52 ms … 3.16 ms) 3.14 ms ███
- ( 4.91 kb … 5.84 kb) 4.95 kb ███▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
+PS512 - jose (sync) 2.79 ms/iter 2.80 ms ▇█
+ (2.71 ms … 3.50 ms) 3.43 ms ██▂
+ ( 4.91 kb … 5.84 kb) 4.95 kb ▂███▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂
-PS512 - jsonwebtoken (sync) 3.56 ms/iter 3.58 ms █▅
- (3.38 ms … 3.61 ms) 3.61 ms ▆█▅██▆
- ( 8.01 kb … 10.53 kb) 8.95 kb ▂▃▁▂▂▄▂▁▂▁▂▁▂▂██████▄
+PS512 - jsonwebtoken (sync) 3.65 ms/iter 3.69 ms █▂
+ (3.53 ms … 4.11 ms) 3.87 ms ▅██ ▆
+ ( 7.74 kb … 10.75 kb) 8.97 kb ▃▂▃▇████▂█▇▆▄▄▂▂▂▁▂▂▂
-PS512 - jsonwebtoken (async) 3.58 ms/iter 3.60 ms █
- (3.38 ms … 3.66 ms) 3.65 ms ██▂
- ( 11.87 kb … 61.14 kb) 13.99 kb ▁▃▂▁▁▁▁▁▁▁▁▁▃▅█████▄▂
+PS512 - jsonwebtoken (async) 3.57 ms/iter 3.57 ms █▂
+ (3.48 ms … 3.86 ms) 3.79 ms ██
+ ( 12.35 kb … 62.06 kb) 14.57 kb ▁▁▂▇██▇▂▂▄▃▂▁▁▁▂▁▁▁▁▁
-PS512 - fast-jwt (sync) 2.56 ms/iter 2.57 ms ██
- (2.52 ms … 3.18 ms) 3.14 ms ██▆
- ( 3.75 kb … 45.22 kb) 4.59 kb ███▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁
+PS512 - fast-jwt (sync) 2.73 ms/iter 2.71 ms █
+ (2.63 ms … 3.40 ms) 3.35 ms █
+ ( 3.88 kb … 42.59 kb) 4.63 kb ▂▂█▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-PS512 - fast-jwt (async) 3.47 ms/iter 3.46 ms █
- (3.35 ms … 3.95 ms) 3.88 ms █▃▆
- ( 9.08 kb … 1.19 mb) 15.77 kb ▄████▃▃▁▂▁▃▂▃▂▁▁▂▁▂▂▂
+PS512 - fast-jwt (async) 3.58 ms/iter 3.62 ms ▂ █▂
+ (3.44 ms … 3.73 ms) 3.68 ms ▃█ ▃██▂
+ ( 9.73 kb … 1.23 mb) 16.88 kb ▂▁▁▂▂▃▆██▇▃▂▂████▆▁▂▂
-PS512 - @node-rs/jsonwebtoken (sync) 2.51 ms/iter 2.61 ms ▅█▄ ▅
- (2.43 ms … 2.64 ms) 2.64 ms ███ ▅ ██
- ( 2.02 kb … 2.28 kb) 2.03 kb ███▆▅▆▄█▃▂▂▁▂▁▁▁▁███▃
+PS512 - @node-rs/jsonwebtoken (sync) 2.60 ms/iter 2.62 ms ██
+ (2.45 ms … 2.67 ms) 2.65 ms ██
+ ( 2.02 kb … 2.28 kb) 2.02 kb ▁▂▁▁▁▁▂▁▁▆▄▂▂▂▁▂██▇▄▁
-PS512 - @node-rs/jsonwebtoken (async) 2.48 ms/iter 2.47 ms █
- (2.44 ms … 2.64 ms) 2.63 ms █▃
- ( 3.05 kb … 3.11 kb) 3.06 kb ▇██▅▄▂▁▁▂▁▁▁▂▂▁▁▂▂▂▂▂
+PS512 - @node-rs/jsonwebtoken (async) 2.57 ms/iter 2.63 ms ▃█
+ (2.45 ms … 2.68 ms) 2.66 ms ██
+ ( 3.66 kb … 3.71 kb) 3.66 kb ▇▇▅█▇▃▃▇▂▄▄▄▂▁▁▂▁██▆▄
summary
PS512 - @node-rs/jsonwebtoken (async)
1.01x faster than PS512 - @node-rs/jsonwebtoken (sync)
- 1.04x faster than PS512 - fast-jwt (sync)
- 1.04x faster than PS512 - jose (sync)
+ 1.06x faster than PS512 - fast-jwt (sync)
+ 1.09x faster than PS512 - jose (sync)
+ 1.39x faster than PS512 - jsonwebtoken (async)
1.4x faster than PS512 - fast-jwt (async)
- 1.44x faster than PS512 - jsonwebtoken (sync)
- 1.45x faster than PS512 - jsonwebtoken (async)
-clk: ~3.78 GHz
+ 1.42x faster than PS512 - jsonwebtoken (sync)
+ ```
+
+
+
+ EdDSA
+ ```
+ clk: ~3.77 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------------- -------------------------------
-EdDSA - jose (sync) 25.36 µs/iter 25.34 µs ██
- (24.75 µs … 26.76 µs) 25.55 µs █ ██
- ( 3.14 kb … 3.14 kb) 3.14 kb █▁▁▁▁▁▁▁▁▁▁▁▁███▁█▁▁█
+EdDSA - jose (sync) 25.42 µs/iter 25.38 µs █
+ (24.79 µs … 26.86 µs) 25.75 µs ▅ ▅ █
+ ( 3.14 kb … 3.14 kb) 3.14 kb █▁▁▁▁▁▁▁▁▁█▇█▁▁▇▁▁▁▁▇
-EdDSA - fast-jwt (sync) 24.98 µs/iter 25.22 µs █ █
- (24.41 µs … 26.73 µs) 25.25 µs ██ ██
- ( 1.89 kb … 1.89 kb) 1.89 kb ██▁▁▁▁▁█▁▁▁▁▁▁▁▁▁▁▁██
+EdDSA - fast-jwt (sync) 25.92 µs/iter 26.61 µs █
+ (24.42 µs … 27.46 µs) 26.88 µs █ ▅▅ ▅▅▅ ▅ ▅▅▅
+ ( 1.89 kb … 1.89 kb) 1.89 kb █▁▁▁▁▁▁██▁▁███▁█▁▁███
-EdDSA - fast-jwt (async) 255.10 µs/iter 256.00 µs █▂
- (247.00 µs … 308.17 µs) 280.63 µs ██▆
- ( 3.98 kb … 954.75 kb) 6.47 kb ▁▁▅████▄▃▂▂▂▂▁▂▁▁▁▁▁▁
+EdDSA - fast-jwt (async) 265.43 µs/iter 275.58 µs █▂▅
+ (247.46 µs … 397.46 µs) 305.67 µs ▃ ████▂ ▂ ▆▅▃
+ ( 4.97 kb … 981.54 kb) 7.59 kb █████████████▄▂▂▂▂▂▁▁
-EdDSA - @node-rs/jsonwebtoken (sync) 2.55 µs/iter 2.56 µs ▂ █▂ ▂
- (2.52 µs … 2.59 µs) 2.59 µs ▂ █▂▇██▅▅▅ █ ▇
- ( 1.27 kb … 1.27 kb) 1.27 kb █▄████████▇█▄▄█▇▁▄▁▁▄
+EdDSA - @node-rs/jsonwebtoken (sync) 2.38 µs/iter 2.38 µs ▆█
+ (2.34 µs … 2.49 µs) 2.49 µs ▇██▇
+ ( 1.27 kb … 1.27 kb) 1.27 kb ▇█████▃▄▁▄▁▃▁▃▁▁▆▁▁▁▃
-EdDSA - @node-rs/jsonwebtoken (async) 9.11 µs/iter 9.12 µs ██
- (9.01 µs … 9.55 µs) 9.33 µs ██ █
- ( 2.17 kb … 2.27 kb) 2.19 kb █████▁▁█▁█▁█▁▁▁▁▁▁▁▁█
+EdDSA - @node-rs/jsonwebtoken (async) 12.48 µs/iter 13.50 µs █
+ (8.79 µs … 118.50 µs) 15.17 µs ▄▆ ▂ ▃█▂
+ ( 2.98 kb … 163.00 kb) 3.25 kb ▁▁▁▄▆▃▆▅██▇▄█████▃▂▁▁
summary
EdDSA - @node-rs/jsonwebtoken (sync)
- 3.58x faster than EdDSA - @node-rs/jsonwebtoken (async)
- 9.81x faster than EdDSA - fast-jwt (sync)
- 9.96x faster than EdDSA - jose (sync)
- 100.23x faster than EdDSA - fast-jwt (async)
-```
+ 5.25x faster than EdDSA - @node-rs/jsonwebtoken (async)
+ 10.69x faster than EdDSA - jose (sync)
+ 10.9x faster than EdDSA - fast-jwt (sync)
+ 111.62x faster than EdDSA - fast-jwt (async)
+ ```
+
+
## Decoding
-```
-clk: ~3.77 GHz
+
+ RS512
+ ```
+ clk: ~3.71 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
---------------------------------------------- -------------------------------
-RS512 - fast-jwt 911.39 ns/iter 915.29 ns ▄█▃
- (890.21 ns … 991.58 ns) 982.05 ns ███▂
- (260.37 b … 458.22 b) 456.86 b ▂▆█████▅▆▂▃▃▂▁▁▂▁▂▁▂▂
+RS512 - fast-jwt 961.66 ns/iter 966.57 ns █▄
+ (926.89 ns … 1.04 µs) 1.03 µs ██▅
+ (189.83 b … 458.22 b) 456.35 b ▂▂▃████▅▅▄▅▃▂▂▄▂▃▂▂▂▂
-RS512 - fast-jwt (complete) 963.04 ns/iter 967.82 ns █▅
- (916.03 ns … 992.09 ns) 988.75 ns ██▃
- (362.40 b … 578.25 b) 576.66 b ▂▂▂▂▂▂▂▂▂▂▃████▇▂▃▅▅▄
+RS512 - fast-jwt (complete) 956.23 ns/iter 963.56 ns ▃█ ▂
+ (925.47 ns … 1.00 µs) 992.61 ns ▅████▇█▇
+ (369.89 b … 578.23 b) 576.72 b ▂▁▁▁▆█████████▄▄▂▃▂▂▂
-RS512 - jsonwebtoken 1.60 µs/iter 1.60 µs █▅▄
- (1.55 µs … 1.70 µs) 1.70 µs ▅▇███▅
- (857.28 b … 867.15 b) 866.93 b ▄██████▅▆▁▁▁▂▅▅▆▂▁▂▅▅
+RS512 - jsonwebtoken 1.63 µs/iter 1.63 µs ▃ ▃█ ▆
+ (1.61 µs … 1.67 µs) 1.65 µs ██▂██▂▇██▅▇▂ ▇
+ (857.28 b … 867.14 b) 866.94 b ▆▆█████████████▆██▃▃▆
-RS512 - jsonwebtoken (complete) 1.64 µs/iter 1.65 µs ▃ █
- (1.58 µs … 1.68 µs) 1.67 µs ███ ▂
- (858.64 b … 891.15 b) 873.72 b ▃▁▁▁▂▁▁▄▁▃▄█████▂▄▅▆▄
+RS512 - jsonwebtoken (complete) 1.63 µs/iter 1.64 µs █ █▆
+ (1.61 µs … 1.66 µs) 1.65 µs ▃▆█ █████ ▃▃
+ (858.70 b … 891.18 b) 873.93 b ▃▇▇█████▅█████▇▅██▅▃▃
-RS512 - jose 742.98 ns/iter 750.80 ns ▃█▇▃
- (691.49 ns … 784.89 ns) 774.26 ns ████▇▃
- (426.12 b … 440.21 b) 435.61 b ▂▂▂▁▄▁▂▂▃█████████▅▄▃
+RS512 - jose 739.80 ns/iter 743.11 ns ██
+ (703.56 ns … 783.20 ns) 771.10 ns ▄███
+ (268.81 b … 426.24 b) 425.35 b ▂▁▁▁▁▁▄██████▆█▃▃▂▄▄▃
-RS512 - jose (complete) 723.30 ns/iter 729.87 ns ▃ ▇█
- (698.66 ns … 757.27 ns) 749.85 ns ▅██▇▅ ▅██▆
- (414.52 b … 446.12 b) 439.71 b ▂▁▃▆██████████▅▆▃▃▆▃▃
+RS512 - jose (complete) 747.62 ns/iter 753.03 ns █
+ (729.11 ns … 799.61 ns) 785.38 ns ▃ ▅██▆█▇▂
+ (414.49 b … 446.12 b) 439.45 b ▃██████████▆▆▃▂▁▅▂▂▁▂
summary
- RS512 - jose (complete)
- 1.03x faster than RS512 - jose
- 1.26x faster than RS512 - fast-jwt
- 1.33x faster than RS512 - fast-jwt (complete)
- 2.21x faster than RS512 - jsonwebtoken
- 2.27x faster than RS512 - jsonwebtoken (complete)
-```
+ RS512 - jose
+ 1.01x faster than RS512 - jose (complete)
+ 1.29x faster than RS512 - fast-jwt (complete)
+ 1.3x faster than RS512 - fast-jwt
+ 2.2x faster than RS512 - jsonwebtoken
+ 2.2x faster than RS512 - jsonwebtoken (complete)
+ ```
+
+
Note that for decoding the algorithm is irrelevant, so only one was measured.
## Verifying
-```
-clk: ~3.77 GHz
+
+ HS512
+ ```
+ clk: ~3.73 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-HS512 - fast-jwt (sync) 2.99 µs/iter 3.83 µs █
- (2.51 µs … 4.08 µs) 4.08 µs █▃
- ( 1.26 kb … 1.26 kb) 1.26 kb ██▁▂▄▁▁▁▁▁▁▁▁▁▁▁▁▆▁▄█
+HS512 - fast-jwt (sync) 3.09 µs/iter 3.97 µs █
+ (2.57 µs … 4.12 µs) 4.12 µs ▇█
+ ( 1.26 kb … 1.26 kb) 1.26 kb ██▁▁▁▁▁▁▁▁▂▁▁▂▁▁▁▁▆▆▆
-HS512 - fast-jwt (async) 5.51 µs/iter 5.58 µs █
- (5.37 µs … 5.78 µs) 5.77 µs ▃█
- (197.31 b … 1.16 kb) 944.07 b ███▁███▁▄▁▄▄▁█▁▁▄█▁▁▄
+HS512 - fast-jwt (async) 5.79 µs/iter 5.77 µs █
+ (5.72 µs … 6.58 µs) 5.88 µs ▆█
+ (271.51 b … 442.32 b) 355.74 b ████▄▁█▄▁▄▄▄▄▁▄▁▁▁▁▁▄
-HS512 - fast-jwt (sync with cache) 1.12 µs/iter 928.33 ns █
- (871.23 ns … 2.25 µs) 2.21 µs █▅
- (494.20 b … 1.24 kb) 715.74 b ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▆▃
+HS512 - fast-jwt (sync with cache) 1.18 µs/iter 976.21 ns █▆
+ (914.38 ns … 2.31 µs) 2.29 µs ██
+ (455.00 b … 1.27 kb) 715.73 b ██▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▃
-HS512 - fast-jwt (async with cache) 1.22 µs/iter 1.57 µs █
- (969.98 ns … 1.81 µs) 1.74 µs █▃ ▆
- ( 1.37 kb … 2.06 kb) 1.47 kb ██▁▄▁▁▁▁▁▁▁▁▁▁▁▇█▂▁▁▂
+HS512 - fast-jwt (async with cache) 1.73 µs/iter 1.92 µs ▇ █
+ (1.48 µs … 2.12 µs) 2.09 µs █ █
+ ( 2.06 kb … 2.34 kb) 2.09 kb █▅▂▁▃▂▁▁▁▁▁▂▁▁██▂▂▁▁▂
-HS512 - jose (sync) 3.50 µs/iter 3.86 µs █
- (3.00 µs … 3.95 µs) 3.93 µs ▅█ █
- ( 2.14 kb … 2.14 kb) 2.14 kb ██▁▃▃▁▁▁▁▁▁▁▁▁▁▁▁▃██▆
+HS512 - jose (sync) 3.51 µs/iter 3.21 µs █
+ (2.79 µs … 3.15 ms) 4.46 µs █▆
+ ( 1.09 kb … 621.12 kb) 2.32 kb ▁▅█▅██▇▂▂▂▁▁▁▁▁▁▁▁▁▁▁
-HS512 - jsonwebtoken (sync) 225.02 µs/iter 226.13 µs █
- (215.00 µs … 426.25 µs) 259.71 µs ██▇▅
- ( 5.43 kb … 1.06 mb) 8.96 kb ▁████▇▄▃▃▄▃▃▂▂▂▂▂▁▁▁▁
+HS512 - jsonwebtoken (sync) 229.01 µs/iter 235.33 µs ▄█▆
+ (211.04 µs … 436.21 µs) 251.83 µs █▆▃ ▃▃████
+ ( 6.15 kb … 1.15 mb) 9.66 kb ▃█████▇▅███████▄▃▂▂▁▂
-HS512 - jsonwebtoken (async) 218.92 µs/iter 219.33 µs █
- (213.17 µs … 321.21 µs) 245.29 µs █
- ( 6.11 kb … 647.65 kb) 6.75 kb ▁▄███▄▂▂▁▁▁▂▂▁▁▁▁▁▁▁▁
+HS512 - jsonwebtoken (async) 234.61 µs/iter 237.54 µs █
+ (224.08 µs … 341.17 µs) 252.88 µs ▃ ▅█▅▃
+ ( 7.55 kb … 8.61 kb) 7.63 kb ▁▂██▅███████▅▄▃▂▂▂▁▁▁
summary
HS512 - fast-jwt (sync with cache)
- 1.09x faster than HS512 - fast-jwt (async with cache)
- 2.66x faster than HS512 - fast-jwt (sync)
- 3.11x faster than HS512 - jose (sync)
- 4.9x faster than HS512 - fast-jwt (async)
- 194.64x faster than HS512 - jsonwebtoken (async)
- 200.06x faster than HS512 - jsonwebtoken (sync)
-clk: ~3.82 GHz
+ 1.48x faster than HS512 - fast-jwt (async with cache)
+ 2.63x faster than HS512 - fast-jwt (sync)
+ 2.98x faster than HS512 - jose (sync)
+ 4.93x faster than HS512 - fast-jwt (async)
+ 194.83x faster than HS512 - jsonwebtoken (sync)
+ 199.6x faster than HS512 - jsonwebtoken (async)
+ ```
+
+
+
+ ES512
+ ```
+ clk: ~3.81 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-ES512 - fast-jwt (sync) 903.15 µs/iter 903.88 µs █
- (835.71 µs … 1.09 ms) 1.01 ms █▄
- ( 2.14 kb … 526.16 kb) 3.05 kb ▁▁▁▁▁▁▁██▃▂▁▁▁▁▁▁▁▁▁▁
+ES512 - fast-jwt (sync) 825.15 µs/iter 825.71 µs █
+ (791.17 µs … 932.88 µs) 876.50 µs █▄
+ ( 2.09 kb … 554.78 kb) 3.59 kb ▁▁▁▁▁▁▆██▄▃▂▂▁▁▁▁▁▁▁▁
-ES512 - fast-jwt (async) 980.26 µs/iter 982.83 µs █
- (908.63 µs … 1.18 ms) 1.03 ms ██
- ( 4.25 kb … 985.26 kb) 9.04 kb ▁▂▁▁▁▁▁▂▁▁▁██▆▃▂▂▂▂▁▁
+ES512 - fast-jwt (async) 901.90 µs/iter 903.96 µs █
+ (856.88 µs … 993.38 µs) 939.96 µs ▄█▅
+ ( 5.07 kb … 773.70 kb) 6.81 kb ▁▁▁▁▁▁▁▁▁████▃▃▂▂▁▁▁▁
-ES512 - fast-jwt (sync with cache) 1.23 µs/iter 1.13 µs █
- (916.00 ns … 3.81 ms) 1.63 µs ▂█▅
- (752.00 b … 196.98 kb) 805.96 b ▁▂▅▁███▄▂▂▁▁▁▁▁▁▁▁▁▁▁
+ES512 - fast-jwt (sync with cache) 1.26 µs/iter 1.13 µs █▂
+ (958.00 ns … 3.40 ms) 1.63 µs ██
+ (840.00 b … 169.67 kb) 893.41 b ▁▁▂▄██▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁
-ES512 - fast-jwt (async with cache) 1.36 µs/iter 1.13 µs █▇
- (1000.00 ns … 1.80 ms) 1.63 µs ██
- ( 1.45 kb … 161.47 kb) 1.81 kb ▁▄▁███▁▃▂▂▁▁▁▁▁▁▁▁▁▁▁
+ES512 - fast-jwt (async with cache) 1.87 µs/iter 1.67 µs ▂█
+ (1.46 µs … 1.72 ms) 2.21 µs ██ ▆
+ ( 2.27 kb … 98.27 kb) 2.47 kb ▁▁▄██▁█▆▃▂▁▁▁▁▁▁▁▁▁▁▁
-ES512 - jose (sync) 900.33 µs/iter 902.67 µs █
- (842.17 µs … 1.03 ms) 951.21 µs █▆
- ( 2.40 kb … 851.02 kb) 4.16 kb ▁▁▁▁▁▁▁▁▁▂██▆▃▂▁▁▁▁▁▁
+ES512 - jose (sync) 829.93 µs/iter 829.67 µs █
+ (779.04 µs … 914.29 µs) 886.83 µs █▂
+ ( 2.40 kb … 819.02 kb) 3.99 kb ▁▁▁▁▁▁▁▂██▄▂▂▂▂▂▂▂▁▁▁
-ES512 - jsonwebtoken (sync) 994.51 µs/iter 998.13 µs ▃█
- (935.75 µs … 1.04 ms) 1.02 ms ██▆
- ( 4.50 kb … 917.00 kb) 6.13 kb ▁▁▁▁▁▂▂▂▁▁▁▁▃███▆▄▂▂▂
+ES512 - jsonwebtoken (sync) 920.19 µs/iter 921.17 µs █
+ (908.54 µs … 1.10 ms) 975.79 µs ▅██
+ ( 4.36 kb … 1.14 mb) 10.62 kb ▂████▅▄▂▂▂▁▁▁▁▁▁▁▁▁▁▁
-ES512 - jsonwebtoken (async) 996.33 µs/iter 999.83 µs █
- (924.92 µs … 1.09 ms) 1.05 ms █▄
- ( 5.04 kb … 1.30 mb) 9.58 kb ▁▁▁▁▁▁▁▁▁▁▇██▅▃▃▃▂▁▁▁
+ES512 - jsonwebtoken (async) 921.54 µs/iter 922.63 µs █▄
+ (907.88 µs … 1.03 ms) 970.63 µs ██
+ ( 5.55 kb … 0.99 mb) 6.98 kb ▁████▇▅▂▃▂▂▁▁▁▁▃▂▂▁▁▁
summary
ES512 - fast-jwt (sync with cache)
- 1.1x faster than ES512 - fast-jwt (async with cache)
- 730.41x faster than ES512 - jose (sync)
- 732.71x faster than ES512 - fast-jwt (sync)
- 795.26x faster than ES512 - fast-jwt (async)
- 806.83x faster than ES512 - jsonwebtoken (sync)
- 808.3x faster than ES512 - jsonwebtoken (async)
-clk: ~3.82 GHz
+ 1.49x faster than ES512 - fast-jwt (async with cache)
+ 656.4x faster than ES512 - fast-jwt (sync)
+ 660.2x faster than ES512 - jose (sync)
+ 717.45x faster than ES512 - fast-jwt (async)
+ 732x faster than ES512 - jsonwebtoken (sync)
+ 733.07x faster than ES512 - jsonwebtoken (async)
+ ```
+
+
+
+ RS512
+ ```
+ clk: ~3.81 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-RS512 - fast-jwt (sync) 44.26 µs/iter 44.86 µs █ █
- (42.39 µs … 46.19 µs) 45.31 µs ▅ ▅ ▅ ▅ ▅ █ █ ▅▅
- ( 1.72 kb … 1.72 kb) 1.72 kb █▁█▁▁█▁▁▁█▁▁█▁█▁▁█▁██
+RS512 - fast-jwt (sync) 44.69 µs/iter 44.63 µs █
+ (44.30 µs … 46.76 µs) 44.93 µs ▅▅█▅▅▅ ▅▅ ▅ ▅
+ ( 1.72 kb … 1.72 kb) 1.72 kb ██████▁▁▁██▁▁▁▁▁█▁▁▁█
-RS512 - fast-jwt (async) 126.47 µs/iter 130.83 µs █
- (119.71 µs … 212.33 µs) 141.33 µs ██▃ █▅
- ( 4.32 kb … 481.60 kb) 5.58 kb ▂███▅▄▂▂▂███▅▃▂▂▂▁▁▁▁
+RS512 - fast-jwt (async) 130.89 µs/iter 132.79 µs ▃█
+ (121.75 µs … 212.67 µs) 144.29 µs ██▇
+ ( 1.42 kb … 533.89 kb) 6.37 kb ▂██▃▃▂▂▇███▇▅▃▂▂▁▂▁▁▁
-RS512 - fast-jwt (sync with cache) 1.53 µs/iter 1.32 µs █
- (1.27 µs … 2.71 µs) 2.66 µs █
- (711.98 b … 721.63 b) 721.37 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▅▃
+RS512 - fast-jwt (sync with cache) 1.51 µs/iter 1.32 µs █
+ (1.25 µs … 2.62 µs) 2.61 µs █▃
+ (712.03 b … 968.96 b) 724.06 b ██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▄▅
-RS512 - fast-jwt (async with cache) 1.69 µs/iter 2.03 µs █ ▂
- (1.38 µs … 2.21 µs) 2.19 µs █▆▄ █
- ( 1.38 kb … 1.48 kb) 1.47 kb ████▁▁▂▁▁▁▁▁▁▁▁▄█▂▄▆▅
+RS512 - fast-jwt (async with cache) 2.15 µs/iter 2.33 µs █ █
+ (1.89 µs … 2.49 µs) 2.48 µs █ █
+ ( 2.06 kb … 2.10 kb) 2.09 kb ██▆▁▂▂▁▁▁▁▁▁▁▁███▄▂▁▄
-RS512 - jose (sync) 46.03 µs/iter 46.33 µs █
- (41.79 µs … 912.33 µs) 57.46 µs ██
- ( 2.30 kb … 403.32 kb) 3.25 kb ▄▇▇▃███▄▄▃▂▂▂▂▂▂▂▁▁▁▁
+RS512 - jose (sync) 48.21 µs/iter 45.71 µs █
+ (41.75 µs … 835.21 µs) 169.25 µs █
+ ( 48.00 b … 328.73 kb) 3.28 kb ▆█▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-RS512 - jsonwebtoken (sync) 130.85 µs/iter 134.96 µs █ ▂
- (120.58 µs … 950.04 µs) 156.00 µs ██▅ █▃
- ( 8.24 kb … 736.30 kb) 9.85 kb ▃███▇▆████▇▅▄▃▂▂▂▂▂▁▁
+RS512 - jsonwebtoken (sync) 129.09 µs/iter 130.75 µs █
+ (119.67 µs … 1.18 ms) 142.04 µs ██
+ ( 2.80 kb … 642.80 kb) 9.87 kb ▂█▄▂▂▂▂▂▆██▅▄▂▂▁▁▁▁▁▁
-RS512 - jsonwebtoken (async) 130.70 µs/iter 135.04 µs █
- (119.92 µs … 2.22 ms) 158.00 µs █▇ ▆
- ( 8.78 kb … 145.44 kb) 8.94 kb ▄███▆▇████▆▄▃▃▂▂▂▂▁▁▁
+RS512 - jsonwebtoken (async) 133.11 µs/iter 132.67 µs █
+ (125.25 µs … 2.09 ms) 143.58 µs █▄
+ ( 9.52 kb … 140.02 kb) 9.59 kb ▁▁▁▁▁▁███▄▄▂▂▁▁▁▁▁▁▁▁
summary
RS512 - fast-jwt (sync with cache)
- 1.1x faster than RS512 - fast-jwt (async with cache)
- 28.88x faster than RS512 - fast-jwt (sync)
- 30.04x faster than RS512 - jose (sync)
- 82.54x faster than RS512 - fast-jwt (async)
- 85.3x faster than RS512 - jsonwebtoken (async)
- 85.4x faster than RS512 - jsonwebtoken (sync)
-clk: ~3.79 GHz
+ 1.42x faster than RS512 - fast-jwt (async with cache)
+ 29.53x faster than RS512 - fast-jwt (sync)
+ 31.85x faster than RS512 - jose (sync)
+ 85.29x faster than RS512 - jsonwebtoken (sync)
+ 86.48x faster than RS512 - fast-jwt (async)
+ 87.94x faster than RS512 - jsonwebtoken (async)
+ ```
+
+
+
+ PS512
+ ```
+ clk: ~3.80 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-PS512 - fast-jwt (sync) 46.70 µs/iter 46.94 µs █
- (45.46 µs … 48.41 µs) 47.57 µs ▅ ▅ ▅ ▅▅ ▅█▅ ▅▅
- ( 1.68 kb … 1.68 kb) 1.68 kb █▁█▁█▁▁▁██▁▁███▁▁▁▁██
+PS512 - fast-jwt (sync) 47.00 µs/iter 47.14 µs █ █
+ (46.62 µs … 47.90 µs) 47.30 µs █▅ ▅ █ ▅▅▅ ▅ ▅
+ ( 1.68 kb … 1.68 kb) 1.68 kb ██▁█▁▁▁█▁▁▁▁▁███▁█▁▁█
-PS512 - fast-jwt (async) 76.25 µs/iter 76.79 µs █▆
- (69.54 µs … 1.03 ms) 93.00 µs ▂ ██
- ( 4.24 kb … 405.16 kb) 5.30 kb ▃█▅▃▂██▆▄▃▂▂▂▂▁▁▁▁▁▁▁
+PS512 - fast-jwt (async) 75.62 µs/iter 76.54 µs █▃
+ (70.04 µs … 4.64 ms) 84.54 µs ▅▂ ██
+ ( 1.81 kb … 423.81 kb) 6.10 kb ▃██▅▃▃▂▅██▇▃▃▂▂▂▁▁▁▁▁
-PS512 - fast-jwt (sync with cache) 1.47 µs/iter 1.32 µs █
- (1.18 µs … 2.76 µs) 2.71 µs █▇
- (703.48 b … 713.17 b) 712.92 b ██▅▃▁▁▁▁▁▁▁▁▁▁▁▁▁▄▃▂▃
+PS512 - fast-jwt (sync with cache) 1.44 µs/iter 1.24 µs █▆
+ (1.17 µs … 2.57 µs) 2.54 µs ██
+ (703.36 b … 969.94 b) 715.57 b ██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▃▇
-PS512 - fast-jwt (async with cache) 1.63 µs/iter 2.00 µs █▅
- (1.37 µs … 2.20 µs) 2.14 µs ██ █
- ( 1.37 kb … 1.47 kb) 1.46 kb ██▅▂▁▁▁▁▁▁▁▁▁▁▁▁▇█▄▂▂
+PS512 - fast-jwt (async with cache) 2.02 µs/iter 2.19 µs █
+ (1.74 µs … 2.43 µs) 2.39 µs ▅▅▅ █ ▂
+ ( 2.06 kb … 2.09 kb) 2.09 kb ███▇▁▁▄▄▂▁▁▁▆███▅▄▁▄▂
-PS512 - jose (sync) 46.12 µs/iter 47.17 µs █ ▄
- (43.38 µs … 145.63 µs) 57.38 µs ▃█▂ █▂
- (800.00 b … 355.27 kb) 3.31 kb ███▅▃██▄▂▂▂▂▁▁▁▁▁▁▁▁▁
+PS512 - jose (sync) 47.34 µs/iter 47.54 µs █
+ (43.46 µs … 138.00 µs) 53.67 µs █▅
+ ( 2.19 kb … 355.05 kb) 3.32 kb ▂▂▁▁▁▁▃██▅▂▁▁▂▁▁▁▁▁▁▁
-PS512 - jsonwebtoken (sync) 77.11 µs/iter 78.04 µs █
- (69.13 µs … 3.15 ms) 99.17 µs ▇▂ █▅
- ( 8.17 kb … 515.30 kb) 9.42 kb ▅██▄███▆▄▄▃▃▂▂▂▁▁▁▁▁▁
+PS512 - jsonwebtoken (sync) 76.00 µs/iter 75.96 µs █
+ (68.88 µs … 3.09 ms) 84.63 µs ██
+ ( 1.77 kb … 637.75 kb) 9.45 kb ▁▄▄▂▂▂▁▆██▅▃▂▂▁▁▁▁▁▁▁
-PS512 - jsonwebtoken (async) 74.75 µs/iter 75.71 µs █
- (69.25 µs … 3.03 ms) 88.79 µs █▄ █▄
- ( 8.68 kb … 426.21 kb) 9.20 kb ▄██▄▃▃██▄▃▂▂▂▁▂▁▁▁▁▁▁
+PS512 - jsonwebtoken (async) 76.97 µs/iter 76.67 µs ██
+ (69.79 µs … 2.68 ms) 84.67 µs ██
+ ( 9.41 kb … 331.65 kb) 9.85 kb ▂▅▃▂▁▁▁▄██▇▃▃▂▂▁▁▁▁▁▁
summary
PS512 - fast-jwt (sync with cache)
- 1.11x faster than PS512 - fast-jwt (async with cache)
- 31.29x faster than PS512 - jose (sync)
- 31.69x faster than PS512 - fast-jwt (sync)
- 50.72x faster than PS512 - jsonwebtoken (async)
- 51.74x faster than PS512 - fast-jwt (async)
- 52.32x faster than PS512 - jsonwebtoken (sync)
-clk: ~3.82 GHz
+ 1.41x faster than PS512 - fast-jwt (async with cache)
+ 32.72x faster than PS512 - fast-jwt (sync)
+ 32.96x faster than PS512 - jose (sync)
+ 52.65x faster than PS512 - fast-jwt (async)
+ 52.91x faster than PS512 - jsonwebtoken (sync)
+ 53.58x faster than PS512 - jsonwebtoken (async)
+ ```
+
+
+
+ EdDSA
+ ```
+ clk: ~3.82 GHz
cpu: Apple M3 Pro
runtime: node 22.13.1 (arm64-darwin)
benchmark avg (min … max) p75 / p99 (min … top 1%)
-------------------------------------------------- -------------------------------
-EdDSA - fast-jwt (sync) 67.83 µs/iter 67.71 µs ██
- (65.88 µs … 98.29 µs) 82.04 µs ██
- ( 1.55 kb … 389.55 kb) 2.22 kb ██▇▄▄▂▂▁▁▁▃▂▁▁▁▁▂▁▁▁▁
+EdDSA - fast-jwt (sync) 67.00 µs/iter 66.71 µs ▅█
+ (65.83 µs … 138.50 µs) 78.21 µs ██
+ ( 1.63 kb … 389.68 kb) 2.52 kb ██▅▃▂▃▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁
-EdDSA - fast-jwt (async) 113.18 µs/iter 116.50 µs █
- (106.92 µs … 328.96 µs) 140.08 µs █ █
- ( 3.52 kb … 421.80 kb) 4.41 kb ▄█▇▄▂██▄▃▂▁▁▁▁▁▁▁▁▁▁▁
+EdDSA - fast-jwt (async) 109.63 µs/iter 109.71 µs █▃
+ (107.54 µs … 179.38 µs) 122.54 µs ██
+ ( 4.43 kb … 581.95 kb) 5.12 kb ▃███▄▄▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁
-EdDSA - fast-jwt (sync with cache) 1.26 µs/iter 1.05 µs █
- (990.07 ns … 2.21 µs) 2.15 µs █
- (880.85 b … 890.36 b) 890.20 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▅▅
+EdDSA - fast-jwt (sync with cache) 1.22 µs/iter 1.03 µs █
+ (963.12 ns … 2.05 µs) 2.04 µs ▅█
+ (598.38 b … 1.45 kb) 893.05 b ██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▅▆
-EdDSA - fast-jwt (async with cache) 1.28 µs/iter 1.55 µs ▂█
- (1.04 µs … 1.82 µs) 1.79 µs ██ ▅█
- ( 1.53 kb … 1.65 kb) 1.64 kb ██▁▃▅▁▁▁▁▁▁▁▁██▃▁▂▁▁▂
+EdDSA - fast-jwt (async with cache) 1.77 µs/iter 1.93 µs ▅ █▃
+ (1.51 µs … 2.01 µs) 1.98 µs █▂ ██
+ ( 2.26 kb … 2.29 kb) 2.26 kb ██▃▄▁▁▁▁▁▁▁▁▁▁▁▁▁██▂▅
-EdDSA - jose (sync) 67.16 µs/iter 67.04 µs █
- (66.17 µs … 105.38 µs) 77.50 µs █
- ( 2.03 kb … 442.41 kb) 3.02 kb ▆█▆▂▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+EdDSA - jose (sync) 67.74 µs/iter 67.04 µs █
+ (66.00 µs … 108.21 µs) 81.58 µs ▅█
+ ( 2.03 kb … 450.41 kb) 3.01 kb ██▃▂▂▂▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁
summary
EdDSA - fast-jwt (sync with cache)
- 1.02x faster than EdDSA - fast-jwt (async with cache)
- 53.46x faster than EdDSA - jose (sync)
- 53.99x faster than EdDSA - fast-jwt (sync)
- 90.09x faster than EdDSA - fast-jwt (async)
-```
+ 1.44x faster than EdDSA - fast-jwt (async with cache)
+ 54.77x faster than EdDSA - fast-jwt (sync)
+ 55.38x faster than EdDSA - jose (sync)
+ 89.63x faster than EdDSA - fast-jwt (async)
+ ```
+
+
diff --git a/benchmarks/decode.mjs b/benchmarks/decode.mjs
index ca8e0ef..ee4454a 100644
--- a/benchmarks/decode.mjs
+++ b/benchmarks/decode.mjs
@@ -7,11 +7,11 @@ const rsToken =
'eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJhIjoxLCJiIjoyLCJjIjozLCJpYXQiOjE1Nzk1MjEyNjF9.X04Dy1GqFCuduViZIqfKzxAXINszEEaywTwh1xU1Q2j03FCHGLe4kM6AmdMeuzPZQgcBxW-R2mGJfpcjDF83iH6fsd0Xs8Boyoml8_AEE9uZTCwpnQEXDHopmAPZ3zijbwgfrJKd0uwzMTi0iJelUhmFz65T_SlW3ZCyK150D7Xwvjq0LaieTFUbAtuJ5rpgHTtiFEtkChAb8lFl3sUYtWKPrmkcmqSQUR660j0jciLBYLG7eymsBiLJz9Knlwg6p5C_Y4hFg-oXKEEIq4G6OFdcfsBGLXhj9rogHRUDBpT_ud7SFYnpvBb3s9pgRM9y8X3eDGqVILSKGrTx4R6tpS1CGvgfUFwtFJk-wgx6JnJUcFFkrRKQ-RQK08AqPDAEZuEOictGsA7uYK5E2IpUSDiYgoZxCYx00NrwTmnvA1f_fz8vVsbfZnGLCwOmQUmFHl3MLZTLk9ti0dW5dWwZU4u-4qTvvytLF4jEKEfvnCv6IjnfYfBo9nAh6zTW5lueT3rehre0lhW6wxfjgflTafeq2C8PV89t1vvy-iIxTz5PoXN-GeyEdChtjbzfT0Tg2pdMAmT6fisGKIYioqSG_0ugn7SskgYrH_SSk8UzkJFd0ksG5DJ3YYwjmrRi3Ll8S46DoxX6v7NOsq9xPiV4wTc8yQnK7zG2P5MdX-uJBK8'
export async function runSuites() {
- const benchmarkOutput = await compareDecoding(rsToken, 'RS512')
+ const result = await compareDecoding(rsToken, 'RS512')
await saveLogs('decode')
- return benchmarkOutput
+ return [{ algorithm: 'RS512', result }]
}
if (import.meta.filename === process.argv[1]) runSuites().catch(console.error)
diff --git a/benchmarks/sign.mjs b/benchmarks/sign.mjs
index f3173a2..4548ec0 100644
--- a/benchmarks/sign.mjs
+++ b/benchmarks/sign.mjs
@@ -3,14 +3,14 @@
import { privateKeys, publicKeys, compareSigning, saveLogs } from './utils.mjs'
export async function runSuites() {
- let benchmarkOutput = []
+ const benchmarkResults = []
for (const algorithm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
- const out = await compareSigning({ a: 1, b: 2, c: 3 }, algorithm, privateKeys[algorithm], publicKeys[algorithm])
- benchmarkOutput.push(out)
+ const result = await compareSigning({ a: 1, b: 2, c: 3 }, algorithm, privateKeys[algorithm], publicKeys[algorithm])
+ benchmarkResults.push({ algorithm, result })
}
await saveLogs('sign')
- return benchmarkOutput.join('\n')
+ return benchmarkResults
}
if (import.meta.filename === process.argv[1]) runSuites().catch(console.error)
diff --git a/benchmarks/update_benchmarks.mjs b/benchmarks/update_benchmarks.mjs
index 90c543a..db1f7ce 100644
--- a/benchmarks/update_benchmarks.mjs
+++ b/benchmarks/update_benchmarks.mjs
@@ -7,27 +7,30 @@ const signBenchmark = await runSignSuites().catch(console.error)
const decodeBenchmark = await runDecodeSuites().catch(console.error)
const verifyBenchmark = await runVerifySuites().catch(console.error)
+const printDetail = ({ algorithm, result }) =>
+ `
+ ${algorithm}
+ \`\`\`
+ ${result}
+ \`\`\`
+
+ `
+
const pageMarkdownContent = `# Benchmarks
## Signing
-\`\`\`
-${signBenchmark}
-\`\`\`
+${signBenchmark.map(printDetail).join('\n')}
## Decoding
-\`\`\`
-${decodeBenchmark}
-\`\`\`
+${decodeBenchmark.map(printDetail).join('\n')}
Note that for decoding the algorithm is irrelevant, so only one was measured.
## Verifying
-\`\`\`
-${verifyBenchmark}
-\`\`\`
+${verifyBenchmark.map(printDetail).join('\n')}
`
await writeFile(new URL('README.md', import.meta.url), pageMarkdownContent, 'utf8')
diff --git a/benchmarks/verify.mjs b/benchmarks/verify.mjs
index 9088541..62e6737 100644
--- a/benchmarks/verify.mjs
+++ b/benchmarks/verify.mjs
@@ -3,13 +3,14 @@
import { tokens, publicKeys, compareVerifying, saveLogs } from './utils.mjs'
export async function runSuites() {
- const benchmarkOutput = []
- for (const algorightm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
- benchmarkOutput.push(await compareVerifying(tokens[algorightm], algorightm, publicKeys[algorightm]))
+ const benchmarkResults = []
+ for (const algorithm of ['HS512', 'ES512', 'RS512', 'PS512', 'EdDSA']) {
+ const result = await compareVerifying(tokens[algorithm], algorithm, publicKeys[algorithm])
+ benchmarkResults.push({ algorithm, result })
}
await saveLogs('verify')
- return benchmarkOutput.join('\n')
+ return benchmarkResults
}
if (import.meta.filename === process.argv[1]) runSuites().catch(console.error)