Skip to content

Performance

This chapter looks under the hood at how Numra’s solvers actually perform — not on toy benchmarks, but on the kinds of problems users bring to the library. Every chart you’ll see was generated by a script that lives in the repo, against a Criterion harness that lives in the repo, on a machine whose specs are stamped into every figure’s caption. If a chart says Numra is fast, you can re-run the bench and check.

  • Tolerance vs runtime — how the cost of an integration scales as you tighten the requested accuracy, across DoPri5, Tsit5, and Vern6 on the Lorenz system.
  • Stiffness handling — how Radau5, BDF, and ESDIRK54 hold up as the Van der Pol stiffness parameter sweeps from μ = 10 to μ = 1000.
  • Dimension scaling — how an explicit solver (DoPri5) and an implicit one (Radau5) cope as the state dimension grows from 2 to 200 on a coupled linear system.
  • Dense-output overhead — what you pay, in wall-clock terms, for enabling continuous interpolation alongside the discrete solution.

Every figure in this chapter follows the same evidence rules so the numbers stand on their own:

  • Criterion is the harness. Each measurement is a Criterion benchmark with a 3-second warm-up and a 20-second measurement window, well above the default. The mean is reported with a 95% confidence interval drawn as a vertical error bar on every point.
  • Deterministic problems. Every benchmark is a closed-form ODE or PDE with no random forcing — the only variance is the OS scheduler and CPU thermal state, both of which are amortised by the long measurement window.
  • One repo, one fingerprint. The caption on every figure carries the Numra commit SHA, the rustc version, the CPU model, and a pointer to the script that re-renders the figure from the same raw Criterion output. A sidecar .provenance.txt ships next to every SVG with the full toolchain fingerprint.
Terminal window
# 1. Measure (slow — about 10 minutes on a recent laptop):
cargo bench -p numra-bench
# 2. Collapse Criterion's per-bench JSON into one file per group:
python3 numra-bench/scripts/criterion_to_json.py
# 3. Render every chart:
make -C website/figures perf

The intermediate JSON (numra-bench/results/*.json) is also checked into git, so step 3 works without re-measuring on machines without the hardware to run the benches at full sample size.

It doesn’t exhaust every solver on every problem; the curated set above is the one that actually matters when you sit down to pick a solver.

For a head-to-head against an established library, see the Numra vs SciPy page next.