Benchmarks

Every benchmark body we run, in one place. These are instruments, not trophy cases — a kernel Koru cannot express, a body without a live data feed, a number that got worse: all of it stays on this page, named.

7 benchmark bodies · 1 with live, reproducible boards. Bodies with a live board rank first; a write-up without one is a wiring gap, and it shows.

Compute kernels

live board · measured Oct 25, 2026, 05:53 PM

Faithful naive kernels — same algorithm, same parameters, no tricks — against C, Rust, Haskell and Osprey under one hyperfine protocol. Reference corpus and the Osprey column vendored from the Osprey language suite (MIT); measured on a shared, loaded M2 Pro, not a quiesced rig.

22 of 22 kernels ported 0 open gaps koru @a23463927 (dirty checkout)
Measured on a shared Apple M2 Pro under active load(load average 3.60 3.35 3.48on 12 cores) — not a quiesced benchmark rig. Read these as same-machine, same-protocol ballpark figures: run-to-run jitter on a loaded box routinely exceeds the gaps between the compiled languages, so treat close cells as ties, not rankings.
kernelKorukoru-foldkoru-parCcgcc3cclangcmapRustHaskellOCamlOspreyc3odinmojobendbend-parKoru / C
ackermann21.8 ±0.2— — 128.2 ±1.7— 127.8 ±1.0— 131.6 ±1.675.5 ±2.5— 128.2 ±1.6— — 146.3 ±1.758.0 ±1.3— 0.17×
binarytrees1.9 ±0.1— 2.2 ±0.1360.3 ±1.5— 361.2 ±2.0— 717.4 ±7.817.6 ±1.2— 379.9 ±4.3— — — 144.4 ±3.2551.3 ±6.30.01×
coins84.8 ±1.0— — 85.0 ±1.4— 79.1 ±1.1— 91.9 ±1.062.7 ±3.9— 88.6 ±7.3— — 93.7 ±1.367.9 ±6.133.2 ±2.41.00×
collatz14.7 ±0.3— 3.6 ±0.212.3 ±0.8— 12.3 ±0.2— 14.6 ±0.441.1 ±1.7— 15.1 ±0.2— — 26.8 ±1.553.0 ±5.348.4 ±2.81.20×
coprime72.3 ±0.8— — 71.1 ±0.9— 70.8 ±0.6— 72.1 ±0.5119.6 ±3.4— 74.8 ±1.1— — 98.1 ±5.490.9 ±1.862.1 ±1.21.02×
digitsum7.3 ±0.1— 2.5 ±0.16.0 ±0.2— 5.9 ±0.1— 6.2 ±0.240.0 ±1.4— 6.5 ±0.1— — 11.0 ±0.334.5 ±1.039.4 ±2.41.22×
exprtree3.1 ±0.5— — 5.5 ±0.2— 5.5 ±0.1— 11.1 ±0.216.5 ±1.2— 6.0 ±0.1— — — 25.6 ±1.5— 0.56×
factorial40.0 ±0.3— 6.7 ±0.740.1 ±0.6— 40.2 ±0.6— 41.4 ±3.763.5 ±2.1— 40.4 ±0.6— — 56.6 ±0.4609.5 ±7.6491.8 ±15.71.00×
fib27.3 ±0.3— 38.8 ±15.027.4 ±0.3— 27.1 ±3.1— 27.6 ±1.063.3 ±1.7— 27.5 ±0.327.7 ±3.127.7 ±0.631.3 ±0.368.5 ±5.329.2 ±2.11.00×
gcdsum91.1 ±17.1— 15.3 ±1.787.0 ±0.9— 88.2 ±5.6— 88.7 ±1.2121.8 ±3.4— 87.1 ±0.9— — 91.1 ±5.4106.3 ±1.963.6 ±1.61.05×
hanoi52.3 ±0.5— — 68.0 ±0.7— 67.8 ±0.8— 68.2 ±0.784.2 ±4.6— 68.2 ±2.9— — 73.0 ±0.778.3 ±2.3— 0.77×
isqrt11.7 ±0.3— 3.5 ±0.214.7 ±0.3— 14.8 ±0.3— 13.5 ±0.554.0 ±3.8— 16.6 ±0.3— — 19.5 ±0.437.2 ±1.330.2 ±1.60.79×
josephus36.5 ±4.5— — 35.6 ±0.7— 36.0 ±0.5— 35.5 ±0.352.8 ±1.8— 36.3 ±0.7— — 53.5 ±1.155.5 ±4.3— 1.03×
listops— — — 1.4 ±0.1— 1.4 ±0.1— 1.8 ±0.217.0 ±2.5— 4.5 ±0.1— — — 19.2 ±1.4—
mutual16.6 ±2.4— 3.9 ±0.316.9 ±0.8— 15.8 ±0.7— 17.2 ±0.840.7 ±2.3— 16.1 ±0.5— — 6.4 ±0.321.8 ±1.921.7 ±1.80.98×
nestedloop53.3 ±0.7— — 53.1 ±0.6— 53.0 ±0.7— 54.2 ±3.375.1 ±3.8— 53.4 ±0.653.7 ±0.653.6 ±0.976.9 ±0.760.6 ±1.541.5 ±2.11.00×
pascal33.8 ±0.4— — 33.7 ±0.4— 34.0 ±0.5— 34.0 ±0.587.2 ±2.1— 34.0 ±0.6— — 39.4 ±0.6255.4 ±3.568.2 ±6.91.00×
powmod30.7 ±4.4— 7.6 ±1.330.8 ±5.5— 28.8 ±0.4— 28.6 ±0.370.2 ±6.1— 28.6 ±0.4— — 63.1 ±1.51515.8 ±12.5816.5 ±1.21.00×
primes7.9 ±0.2— 2.8 ±0.18.0 ±0.2— 7.9 ±0.1— 8.6 ±0.228.5 ±1.1— 8.0 ±0.28.6 ±1.18.2 ±0.212.9 ±0.328.0 ±1.025.2 ±1.60.99×
tak36.3 ±0.3— 36.7 ±0.543.0 ±0.6— 42.9 ±0.3— 43.3 ±0.5101.9 ±4.4— 43.2 ±0.6— — 47.5 ±0.3103.2 ±6.050.6 ±3.80.84×
textstats2.5 ±0.2— — 2.5 ±0.1— 2.4 ±0.1— 2.5 ±0.124.9 ±5.3— 4.2 ±0.2— — 9.6 ±0.329.6 ±1.527.5 ±2.21.01×
wordfreq4.0 ±0.11.6 ±0.1— 1.7 ±0.1— 1.7 ±0.12.8 ±0.15.8 ±0.316.6 ±0.8— 20.8 ±0.85.7 ±0.74.7 ±0.311.3 ±0.621.1 ±1.825.4 ±3.42.36×

Mean wall-clock ms, lower is better · '—' = toolchain absent or no port · 'WRONG' = failed the oracle, excluded from timing · Koru / C is the ratio of means from this run only.

How these numbers were made
Machine
Darwin arm64 · Apple M2 Pro · load 3.60 3.35 3.48 on 12 cores (shared box, not quiesced)
Protocol
hyperfine -N, warmup 3, min 10 runs
Build flags
Koru: koruc build (ReleaseFast)
koru-fold: koruc build (ReleaseFast) — flat fold/identity port
koru-par: koruc build (ReleaseFast) — [parallel]-annotated port (fold split / fork-join)
C: cc -O2
cgcc3: gcc -O3 (real GCC only — ABSENT when gcc is clang)
cclang: clang -O3
Rust: rustc -C opt-level=3 -C overflow-checks=off
Haskell: ghc -O2
OCaml: ocamlopt -O3 -unsafe
Osprey: osprey --compile (release)
cmap: cc -O2 (hand-rolled string map)
c3: c3c compile -O5
odin: odin build -o:speed
mojo: mojo build (default -O3)
bend: bend build → native via clang (BendRT)
bend-par: bend build → native via clang — parallel-fork variant
Toolchains
C: Apple clang version 21.0.0 (clang-2100.0.123.102)
cgcc3: absent — not measured, never estimated
cclang: Apple clang version 21.0.0 (clang-2100.0.123.102)
Rust: rustc 1.96.0-nightly (b41f22de2 2026-03-08)
Haskell: ghc 9.10.3
OCaml: absent — not measured, never estimated
Osprey: osprey 0.0.0-dev
cmap: Apple clang version 21.0.0 (clang-2100.0.123.102)
c3: C3 Compiler Version: 0.8.3
odin: /Users/larsde/src/odin/odin version dev-2026-08:3e159a4
mojo: Mojo 1.2.0.dev2026091605 (9a2c5cbe)
bend: bend 2.0.5
bend-par: bend 2.0.5

MEASURED on the shared developer workstation named above, under live load (see machine.load_avg — the 1/5/15-min load average at run time) — NOT a quiesced benchmark rig. Read every number as a same-machine, same-protocol ballpark, not a precise cross-language ranking: run-to-run jitter on a loaded box routinely exceeds the gaps between the compiled languages. Wrong-answer binaries are excluded from timing. Absent toolchains are reported absent, never estimated. No cross-language claim leaves this board unless re-verified under the target's exact rules.

Source, harness and raw results: github.com/korulang/koru-benchmarks

Prime-sieve drag race

no live board yet — write-ups only

The Primes drag-race sieve — where "faithful" earned its capital letters, and what a category boundary does to a comparison.

n-body & std/kernel

no live board yet — write-ups only

Dense numeric workloads through std/kernel — idiomatic high-level Koru against hand-specialized C and Rust.

HTTP serving (Orisha)

no live board yet — write-ups only

The Orisha HTTP server under load, measured against nginx on the same box.

Recursion → loop

no live board yet — write-ups only

The register-machine story: recursion the compiler proves is a loop, and what that does to the emitted code.

Footprint

no live board yet — write-ups only

How small the artifacts get — binary size and deployment weight.

Interpreter

no live board yet — write-ups only

The comptime interpreter, measured honestly while it is still slow. Parked, red, and on the page anyway — that is the point of the page.