Skip to content

Cedarling Benchmarks#

Cross-platform authorization benchmarks for the Cedarling bindings, regenerated on pushes to main that change jans-cedarling/**, or on a manual workflow_dispatch run against main.

Last updated: 2026-09-08 08:09 UTC (commit 565c170).

Provenance#

  • Each binding is measured on its own GitHub-hosted ubuntu-latest runner. Runners are provisioned fresh per binding, so cross-binding comparisons are unpaired and subject to per-runner variance; read cross-binding ratios as directional rather than exact, especially for closely-matched bindings.
  • Warm-up iterations per scenario: 100; measured (sample count) per scenario: 1000.
  • Exact host, OS, and compiler/runtime versions for this run are recorded in the immutable workflow logs: https://github.com/JanssenProject/jans/actions/runs/34201168783/attempts/1.
  • Scenario definitions and fixtures: jans-cedarling/bindings/benchmarks/fixtures/scenarios.json.

Cross-Platform Binding Benchmarks#

Mean (µs) per scenario x binding#

Scenario c go python rust wasm
multi_issuer_2_tokens 218.2 259.2 187.4 203.0 476.8
multi_issuer_3_tokens 276.0 313.7 247.0 261.2 580.6
multi_issuer_batch_10 1,398.6 1,543.5 1,191.2 1,367.0 2,793.8
multi_issuer_batch_25 3,328.9 3,726.0 2,806.1 3,266.9 6,670.3
multi_issuer_sig_status skipped skipped skipped skipped skipped
unsigned_batch_10 384.9 494.9 289.3 367.4 1,110.9
unsigned_batch_25 936.6 1,166.9 728.8 912.3 2,636.8
unsigned_deep_json 147.9 186.7 122.7 135.9 343.0
unsigned_simple 50.4 75.7 32.0 42.8 195.6

Note: unsigned_batch_* and multi_issuer_batch_* measure the full batch call, not per-item latency.

Relative speed per scenario (x vs Rust, lower = faster)#

Ratios use each binding's full-precision mean_ns over Rust's, so they may not match dividing the rounded µs values shown above. Rows where Rust is unavailable use the fastest binding as the baseline.

Scenario c go python rust wasm
multi_issuer_2_tokens 1.07x █████ 1.28x █████ 0.92x ████ 1.00x ████ 2.35x ██████████
multi_issuer_3_tokens 1.06x █████ 1.20x █████ 0.95x ████ 1.00x ████ 2.22x ██████████
multi_issuer_batch_10 1.02x █████ 1.13x ██████ 0.87x ████ 1.00x █████ 2.04x ██████████
multi_issuer_batch_25 1.02x █████ 1.14x ██████ 0.86x ████ 1.00x █████ 2.04x ██████████
multi_issuer_sig_status skipped skipped skipped skipped skipped
unsigned_batch_10 1.05x ███ 1.35x ████ 0.79x ███ 1.00x ███ 3.02x ██████████
unsigned_batch_25 1.03x ████ 1.28x ████ 0.80x ███ 1.00x ███ 2.89x ██████████
unsigned_deep_json 1.09x ████ 1.37x █████ 0.90x ████ 1.00x ████ 2.52x ██████████
unsigned_simple 1.18x ███ 1.77x ████ 0.75x ██ 1.00x ██ 4.57x ██████████

Latency columns (Mean, p50, p95, p99, Min, Max) in the detail tables below are microseconds (µs).

c detail#

Scenario Mean (µs) p50 (µs) p95 (µs) p99 (µs) Min (µs) Max (µs) Allocs/op Status
multi_issuer_2_tokens 218.2 207.8 252.8 354.5 201.4 390.3 ok
multi_issuer_3_tokens 276.0 266.1 298.4 424.0 259.0 492.8 ok
multi_issuer_batch_10 1,398.6 1,384.8 1,456.4 1,956.3 1,347.9 2,134.2 ok
multi_issuer_batch_25 3,328.9 3,318.9 3,396.9 3,510.9 3,269.2 3,859.9 ok
multi_issuer_sig_status skipped (mock_op_unavailable)
unsigned_batch_10 384.9 371.0 419.1 559.9 361.8 728.6 ok
unsigned_batch_25 936.6 924.6 973.7 1,387.8 889.5 1,730.8 ok
unsigned_deep_json 147.9 140.5 179.8 253.1 135.5 338.9 ok
unsigned_simple 50.4 46.5 75.1 89.2 45.2 111.1 ok

go detail#

Scenario Mean (µs) p50 (µs) p95 (µs) p99 (µs) Min (µs) Max (µs) Allocs/op Status
multi_issuer_2_tokens 259.2 251.7 292.7 344.2 236.0 589.1 29.06 ok
multi_issuer_3_tokens 313.7 304.4 343.2 389.3 290.9 1,237.9 31.066 ok
multi_issuer_batch_10 1,543.5 1,523.1 1,621.7 1,999.3 1,456.7 6,197.3 356.255 ok
multi_issuer_batch_25 3,726.0 3,657.9 4,001.4 4,421.6 3,527.9 19,974.0 881.573 ok
multi_issuer_sig_status skipped (mock_op_unavailable)
unsigned_batch_10 494.9 488.6 550.9 727.5 450.6 1,272.9 355.268 ok
unsigned_batch_25 1,166.9 1,144.1 1,248.4 1,693.8 1,097.1 4,795.0 865.498 ok
unsigned_deep_json 186.7 180.3 211.3 253.5 172.1 825.0 68.026 ok
unsigned_simple 75.7 71.0 99.4 122.4 67.4 241.8 37.029 ok

python detail#

Scenario Mean (µs) p50 (µs) p95 (µs) p99 (µs) Min (µs) Max (µs) Allocs/op Status
multi_issuer_2_tokens 187.4 181.3 210.0 242.6 175.0 311.4 ok
multi_issuer_3_tokens 247.0 241.6 266.5 293.7 233.0 341.3 ok
multi_issuer_batch_10 1,191.2 1,183.0 1,254.0 1,299.3 1,156.3 1,351.9 ok
multi_issuer_batch_25 2,806.1 2,785.8 2,898.8 3,184.5 2,727.5 4,809.7 ok
multi_issuer_sig_status skipped (mock_op_unavailable)
unsigned_batch_10 289.3 283.8 306.2 349.9 277.9 444.3 ok
unsigned_batch_25 728.8 711.4 868.5 1,110.6 687.6 1,382.7 ok
unsigned_deep_json 122.7 115.7 149.5 227.3 112.7 246.4 ok
unsigned_simple 32.0 31.3 34.2 48.3 30.5 61.0 ok

rust detail#

Scenario Mean (µs) p50 (µs) p95 (µs) p99 (µs) Min (µs) Max (µs) Allocs/op Status
multi_issuer_2_tokens 203.0 197.6 224.0 231.8 193.3 269.9 ok
multi_issuer_3_tokens 261.2 254.7 281.8 293.7 249.2 373.4 ok
multi_issuer_batch_10 1,367.0 1,360.0 1,397.3 1,459.2 1,340.1 1,666.0 ok
multi_issuer_batch_25 3,266.9 3,257.0 3,337.9 3,438.8 3,216.9 3,753.8 ok
multi_issuer_sig_status skipped (mock_op_unavailable)
unsigned_batch_10 367.4 358.7 385.8 402.2 351.5 606.9 ok
unsigned_batch_25 912.3 911.1 927.8 980.8 878.9 1,178.4 ok
unsigned_deep_json 135.9 132.0 157.0 164.0 128.7 197.0 ok
unsigned_simple 42.8 41.3 55.2 67.8 40.2 87.2 ok

wasm detail#

Scenario Mean (µs) p50 (µs) p95 (µs) p99 (µs) Min (µs) Max (µs) Allocs/op Status
multi_issuer_2_tokens 476.8 457.8 678.6 733.5 413.5 932.3 ok
multi_issuer_3_tokens 580.6 554.7 786.9 985.4 512.8 1,346.5 ok
multi_issuer_batch_10 2,793.8 2,701.8 3,487.8 4,452.7 2,625.7 5,045.8 ok
multi_issuer_batch_25 6,670.3 6,454.2 8,534.8 8,810.1 6,284.9 9,757.3 ok
multi_issuer_sig_status skipped (mock_op_unavailable)
unsigned_batch_10 1,110.9 1,061.3 1,397.9 1,817.0 1,022.5 2,212.2 ok
unsigned_batch_25 2,636.8 2,493.9 3,526.8 4,536.3 2,408.7 9,521.7 ok
unsigned_deep_json 343.0 327.3 473.9 532.1 287.9 775.1 ok
unsigned_simple 195.6 164.6 276.4 539.2 142.4 1,311.6 ok