Benchmarks

By Christian Findlay

Elapsed time and peak resident memory for 24 small programs, each written with the same algorithm in every language. A program must print its expected output before it is timed. The methodology, sources, harness and raw data are open.

Figure What it is
CPU time Mean wall-clock time over at least 10 runs after 3 warm-up runs (hyperfine -N), including process start-up and excluding compilation. The small figure below it is the standard deviation. Hover a cell for the median, minimum, maximum and run.
Peak memory Highest resident set size over three runs. — means not measured: a WebAssembly run's RSS is the Wasmtime host's.
★ and bold ★ marks the lowest time in a row when it is an Osprey column; bold marks the lowest otherwise.

Figures come from the runs listed in the last table, on different dates and machines.

Osprey time relative to each language

For each program, Osprey's mean time is divided by the other language's mean time. Each row summarises those per-program ratios: their geometric mean, their median, and the geometric standard deviation, the factor by which a typical program differs from the geometric mean. 1.50× means Osprey took one and a half times as long; below 1× means it took less time.

Compared withOsprey backendGeometric meanMedianGeometric SDCases
RustOsprey (ARC)1.56×1.03××3.6124
Osprey (GC)1.97×1.14××3.6624
COsprey (ARC)1.86×1.04××3.9224
Osprey (GC)2.34×1.28××4.3524
C# (AOT)Osprey (ARC)1.34×0.85××3.2224
Osprey (GC)1.69×0.86××3.9924
Dart (AOT)Osprey (ARC)0.66×0.60××3.2324
Osprey (GC)0.83×0.63××4.0024
CodonOsprey (ARC)0.96×0.80××2.5624
Osprey (GC)1.21×0.85××2.9224
OCamlOsprey (ARC)1.29×0.75××3.4424
Osprey (GC)1.63×0.75××4.5624
HaskellOsprey (ARC)0.85×0.59××3.1624
Osprey (GC)1.07×0.63××4.0624
Rust (wasm)Osprey (wasm)1.27×0.90××2.5524

CPU time

BenchmarkOsprey (ARC)Osprey (GC)RustCC# (AOT)Dart (AOT)CodonOCamlHaskellOsprey (wasm)Rust (wasm)
ackermann122.3 ms±1.3121.9 ms±1.2129.3 ms±2.3130.6 ms±1.8132.4 ms±3.6185.3 ms±2.2137.9 ms±4.8111.3 ms±0.565.3 ms±2.4142.8 ms±1.6145.5 ms±1.0
binarytrees225.9 ms±10.31.216 s±0.0131.967 s±0.686891.5 ms±175.1128.4 ms±1.1128.6 ms±1.6249.5 ms±4.952.3 ms±0.717.0 ms±1.7371.5 ms±4.7818.6 ms±8.9
coins75.1 ms±0.675.1 ms±0.684.5 ms±1.279.8 ms±1.4104.4 ms±1.4126.0 ms±1.5115.2 ms±20.3103.3 ms±1.152.3 ms±2.8103.0 ms±0.8114.0 ms±1.7
collatz51.0 ms±0.551.1 ms±0.613.4 ms±0.410.8 ms±0.259.3 ms±1.072.7 ms±11.226.2 ms±2.564.6 ms±9.240.2 ms±1.366.7 ms±0.725.4 ms±0.4
coprime67.2 ms±0.767.2 ms±0.866.4 ms±0.865.0 ms±1.080.5 ms±1.9111.6 ms±2.184.4 ms±3.4119.4 ms±50.6220.3 ms±56.877.4 ms±0.7163.3 ms±35.8
digitsum14.0 ms±0.413.9 ms±0.26.1 ms±0.56.1 ms±0.421.2 ms±3.532.8 ms±4.912.6 ms±1.419.5 ms±1.229.4 ms±2.928.9 ms±0.418.8 ms±1.4
exprtree5.5 ms±0.223.5 ms±0.611.1 ms±1.26.1 ms±0.27.7 ms±1.815.8 ms±3.018.2 ms±5.65.1 ms±0.316.3 ms±0.813.3 ms±0.320.4 ms±0.4
factorial30.8 ms±0.330.7 ms ★±0.335.6 ms±0.635.3 ms±0.437.4 ms±0.451.2 ms±1.150.2 ms±1.748.7 ms±0.553.5 ms±3.138.0 ms±0.548.6 ms±0.7
fib20.6 ms ★±0.920.6 ms±0.929.2 ms±2.528.1 ms±2.543.3 ms±4.759.8 ms±5.732.9 ms±10.429.5 ms±2.756.5 ms±5.642.6 ms±1.049.4 ms±5.5
gcdsum80.1 ms ★±0.580.1 ms±0.586.1 ms±5.886.5 ms±5.592.8 ms±3.1122.0 ms±12.7100.6 ms±3.3107.7 ms±3.6115.0 ms±7.188.4 ms±1.0104.3 ms±6.7
hanoi51.6 ms±5.950.1 ms±4.737.5 ms±1.438.5 ms±1.138.7 ms±2.1103.9 ms±2.553.0 ms±2.962.9 ms±1.254.4 ms±3.975.4 ms±1.052.3 ms±1.4
isqrt13.3 ms±1.213.3 ms±1.110.9 ms±0.110.6 ms±0.917.1 ms±0.832.5 ms±0.337.7 ms±1.720.6 ms±0.341.0 ms±1.227.3 ms±0.522.9 ms±0.6
josephus29.1 ms±0.429.1 ms ★±0.533.8 ms±1.233.4 ms±0.435.9 ms±2.042.0 ms±1.045.5 ms±0.542.0 ms±0.844.5 ms±4.534.2 ms±0.444.4 ms±0.4
listops4.2 ms±0.39.3 ms±0.21.5 ms±0.11.3 ms±0.13.3 ms±0.310.8 ms±0.59.2 ms±1.42.2 ms±0.316.6 ms±0.810.3 ms±0.312.5 ms±0.3
mergesort268.8 ms±4.0391.2 ms±2.53.4 ms±0.42.5 ms±0.23.8 ms±0.414.0 ms±1.713.3 ms±0.74.8 ms±0.316.3 ms±0.9405.2 ms±3.414.9 ms±1.8
mutual17.7 ms±0.617.7 ms±0.613.1 ms±0.312.9 ms±0.421.5 ms±0.4335.0 ms±8.418.3 ms±0.829.1 ms±1.640.7 ms±1.222.6 ms±0.930.0 ms±0.3
nestedloop44.1 ms ★±0.644.2 ms±1.046.4 ms±0.246.0 ms±0.248.4 ms±0.360.6 ms±0.360.8 ms±0.458.5 ms±0.265.2 ms±1.656.5 ms±2.062.9 ms±0.4
pascal39.6 ms±1.139.1 ms±1.327.9 ms±0.928.2 ms±1.034.1 ms±0.765.2 ms±0.737.0 ms±1.245.1 ms±0.665.0 ms±2.669.1 ms±0.546.9 ms±0.4
powmod28.7 ms±0.628.7 ms±0.527.4 ms±2.627.5 ms±2.640.1 ms±2.258.8 ms±1.452.8 ms±1.171.1 ms±3.665.4 ms±1.841.3 ms±0.539.5 ms±0.4
primes6.3 ms±0.46.2 ms ★±0.27.1 ms±0.77.1 ms±0.910.7 ms±1.052.6 ms±2.613.3 ms±0.410.0 ms±1.818.7 ms±4.322.3 ms±0.321.0 ms±1.3
quicksort150.9 ms±2.1227.3 ms±2.74.1 ms±1.12.5 ms±0.56.3 ms±1.614.9 ms±2.613.3 ms±0.75.8 ms±0.516.6 ms±1.1230.2 ms±1.314.8 ms±1.3
tak31.9 ms ★±0.431.9 ms±0.437.5 ms±1.337.3 ms±0.540.5 ms±2.593.3 ms±2.748.6 ms±0.651.2 ms±1.475.0 ms±4.481.0 ms±0.692.0 ms±1.0
textstats7.8 ms±0.37.5 ms±0.42.0 ms±0.12.2 ms±0.23.8 ms±0.211.4 ms±0.49.2 ms±0.34.0 ms±0.416.7 ms±1.513.1 ms±0.314.9 ms±6.2
wordfreq25.2 ms±0.763.6 ms±1.69.1 ms±3.11.9 ms±2.83.3 ms±0.210.6 ms±0.312.6 ms±2.02.5 ms±0.216.4 ms±0.639.7 ms±1.115.7 ms±0.3

Peak memory

BenchmarkOsprey (ARC)Osprey (GC)RustCC# (AOT)Dart (AOT)CodonOCamlHaskellOsprey (wasm)Rust (wasm)
ackermann1.9 MiB1.9 MiB1.8 MiB1.7 MiB7.1 MiB14.0 MiB7.6 MiB2.7 MiB15.1 MiB——
binarytrees2.9 MiB17.8 MiB3.0 MiB2.2 MiB16.1 MiB22.5 MiB14.4 MiB5.2 MiB11.1 MiB——
coins1.5 MiB1.6 MiB1.6 MiB1.5 MiB6.8 MiB13.9 MiB7.4 MiB2.3 MiB11.1 MiB——
collatz1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB14.0 MiB7.4 MiB2.3 MiB11.1 MiB——
coprime1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB14.0 MiB7.4 MiB2.3 MiB11.1 MiB——
digitsum1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB14.0 MiB7.4 MiB2.3 MiB11.1 MiB——
exprtree3.5 MiB22.3 MiB2.7 MiB11.5 MiB15.2 MiB22.5 MiB14.5 MiB6.1 MiB11.4 MiB——
factorial1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB13.9 MiB7.4 MiB2.3 MiB11.1 MiB——
fib1.5 MiB ★1.6 MiB2.1 MiB1.6 MiB6.8 MiB13.9 MiB7.4 MiB2.2 MiB11.2 MiB——
gcdsum1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB14.0 MiB7.4 MiB2.3 MiB11.1 MiB——
hanoi1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB13.8 MiB7.4 MiB2.3 MiB11.2 MiB——
isqrt1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB13.9 MiB7.4 MiB2.3 MiB11.1 MiB——
josephus1.5 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB13.8 MiB7.3 MiB2.3 MiB11.1 MiB——
listops2.2 MiB8.0 MiB1.7 MiB1.5 MiB7.1 MiB14.3 MiB8.6 MiB2.6 MiB11.4 MiB——
mergesort2.2 MiB8.8 MiB2.1 MiB1.7 MiB10.7 MiB16.5 MiB13.7 MiB5.1 MiB11.3 MiB——
mutual1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB14.0 MiB7.4 MiB2.3 MiB11.1 MiB——
nestedloop1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB13.9 MiB7.3 MiB2.2 MiB11.1 MiB——
pascal1.5 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB13.9 MiB7.4 MiB2.2 MiB11.1 MiB——
powmod1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB14.0 MiB7.4 MiB2.3 MiB11.1 MiB——
primes1.6 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB14.0 MiB7.4 MiB2.2 MiB11.1 MiB——
quicksort2.0 MiB ★9.0 MiB2.1 MiB2.5 MiB15.0 MiB16.6 MiB13.7 MiB5.0 MiB11.4 MiB——
tak1.5 MiB1.6 MiB1.6 MiB1.4 MiB6.9 MiB13.9 MiB7.4 MiB2.3 MiB11.2 MiB——
textstats1.7 MiB1.6 MiB1.6 MiB1.4 MiB6.8 MiB14.0 MiB7.5 MiB2.3 MiB11.4 MiB——
wordfreq1.7 MiB ★9.8 MiB2.2 MiB1.8 MiB6.8 MiB14.0 MiB7.5 MiB2.3 MiB11.4 MiB——

Where each figure was measured

MeasuredCPUOSToolchainsFigures
2026-11-06Apple M4 MaxmacOS 26.7.1Osprey 67b766d1f, Clang 23.1.4, Wasmtime 46.0.1, hyperfine 1.20.0Osprey (ARC), Osprey (GC), Osprey (wasm): every case
2026-11-05Apple M4 MaxmacOS 26.7.1Codon 0.20.6Built with -release; load average 15 to 22 during the runCodon: every case
2026-10-05Apple M4 MaxmacOS 26.6Clang 22.1.8, Rust 1.99.0, .NET 10.0.303, Dart 3.13.3, OCaml 5.4.1, GHC 9.14.1, Wasmtime 46.0.1Rust, C, C# (AOT), Dart (AOT), OCaml, Haskell, Rust (wasm): mergesort, quicksort
2026-10-03AMD Ryzen 9 3900XLinux (WSL2)Clang 21.1.8, Rust 1.98.1, GCC 15.2.0, Wasmtime 49.0.2Pinned to logical CPU 20Rust, C: binarytrees, fib, wordfreq
2026-08-20not recordednot recorded—Recovered from the 20 August 2026 results file; Rust (wasm) predates the 4 MiB stack budgetRust, C: every case except binarytrees, fib, mergesort, quicksort, wordfreq; C# (AOT), Dart (AOT), OCaml, Haskell, Rust (wasm): every case except mergesort, quicksort

Reproduce

make -C src/toolchain/benchmarks bench-osprey                # re-time the Osprey columns only
BENCH_FILTER=wordfreq make -C src/toolchain/benchmarks bench # one program across installed toolchains

Each run replaces only the figures it measured and records its machine and toolchain versions.