Performance

What a forecast costs. Accuracy comparisons live on the benchmarks page; this is the runtime axis, measured on one machine with every model given the same core budget. There are two regimes and they disagree, so both are reported.

Streaming: one new observation arrives

laplace is online. A new observation costs a single state update whose cost does not depend on how much history preceded it. A foundation model carries no state, so it re-runs its whole forward pass over a shifted window every time. This is the regime a live deployment runs in.

modelms per observationvs laplace (Rust) k=1
laplace (Rust) k=120.151112×
laplace (Python) k=10.250620×
AutoETS (refit)1.9310157×
Chronos-Bolt-small7.4397604×
Prophet (refit)29.96602,434×
AutoARIMA (refit)62.13365,047×
TiRex95.68317,772×
TimesFM-2.5-200M329.829026,792×

Batch: one forecast for a series never seen before

This is the benchmark protocol, and it is laplace at its worst: it must consume the whole history to warm up, while a foundation model amortises a batched forward pass across many series. Best batch size shown per model.

modelms per seriesregime
Chronos-Bolt-small0.7215cold b=64
AutoETS (refit)1.9310cold
laplace (Rust) k=13.3897cold
TimesFM-2.5-200M5.0996cold b=64
Prophet (refit)29.9660cold
laplace (Rust) k=1242.6171cold
AutoARIMA (refit)62.1336cold
laplace (Python) k=167.0809cold
TiRex74.9486cold b=16

Every measurement

modelregimemsnote
laplace (Rust) k=1cold3.3897replays 256 points
laplace (Rust) k=1warm0.0123one online update
laplace (Rust) k=12cold42.6171replays 256 points
laplace (Rust) k=12warm0.1511one online update
laplace (Python) k=1cold67.0809replays 256 points
laplace (Python) k=1warm0.2506one online update
Chronos-Bolt-smallcold b=17.440948M params, batched
Chronos-Bolt-smallcold b=161.292448M params, batched
Chronos-Bolt-smallcold b=640.721548M params, batched
Chronos-Bolt-smallwarm7.4397stateless: full re-forward
TiRexcold b=196.472935M params, xLSTM, batched
TiRexcold b=1674.948635M params, xLSTM, batched
TiRexcold b=6476.337735M params, xLSTM, batched
TiRexwarm95.6831stateless: full re-forward
Sundial-base-128mcoldn/aunavailable: AttributeError: 'DynamicCache' object has no attribute 'seen_tokens'
TimesFM-2.5-200Mcold b=1323.4401200M params, batched
TimesFM-2.5-200Mcold b=1620.2639200M params, batched
TimesFM-2.5-200Mcold b=645.0996200M params, batched
TimesFM-2.5-200Mwarm329.8290stateless: full re-forward
AutoARIMA (refit)cold62.1336fit on 256 points
AutoARIMA (refit)warm62.1336refits from scratch every step
AutoETS (refit)cold1.9310fit on 256 points
AutoETS (refit)warm1.9310refits from scratch every step
Prophet (refit)cold29.9660fit on 256 points
Prophet (refit)warm29.9660refits from scratch every step

Caveats

Reproducing this

Every number on this page is generated, not typed. The script measures each model and writes both this page and the machine-readable results beside it, so re-running it refreshes the page and nothing here can drift from the data.

PYTHONPATH=src:benchmarks python benchmarks/perf_compare.py

Knobs, as environment variables: PERF_L context length, PERF_H horizon, PERF_N series count, TORCH_THREADS core budget for the neural models. Each model is warmed up before timing and reported as the median of repeats.

Measured 2026-08-12 on Darwin arm64, Python 3.11.15, skaters 0.16.0+8ddc8d5, context 256 points, horizon 12, 64 series, median of repeats.