03 / Evals
Measured, not claimed.
neo is our proprietary C++ engine. Every number below was printed by a script, on one machine, against the same input, and checked for the same output. The same kernels were ported to four other languages and told to beat it. Where something else is quicker, it is shown quicker.
Progress since the saved language comparison
Finish small jobs without waiting on sleeping threads
94.7% less paired time · Small pipeline · Full command: startup through exit.
All 23 controls passed. See the saved language results alongside the improvements to aggregation, verification and command completion →
Earlier research and experiment history
V13 · accepted follow-up
Command completion without idle shutdown waits.
The complete release decision includes both clocks, every control and exact-output checks →
V11 · retained improvement
Less repeated result verification.
The earlier accepted study compares C++ workflows under its own fixed protocol and timing boundary →
V12 · earlier trial rejected
The shutdown-only experiment.
This earlier candidate missed its combined gate. The accepted follow-up passed every control; both studies keep their original decisions and measurements →
- 33×
- the median speed-up over the JavaScript it replaces
- 627 / 627
- cases where old and new give the same output
- 9.11 mJ
- of energy to total a column by group, 1,000,000 rows, one run from rest
- 0.020 ms
- to total a column by group, 1,000,000 rows
57 cases over 23 nodes at 250,000 rows; the least 4.7×, the most 1,356×
the original JavaScript and the C++ on the same input, output for output (tools/eval/eval.py)
the same in Polars 3× · DuckDB 4× · pandas 6× · Spark 86× as much
the same in Polars 77× · DuckDB 112× · pandas 612× · Spark 1,948× as long
Lower is better · the measurement, with each column's multiple of neo in gray · click an engine for its comparison, or a kernel for its chart
The same kernels, in other languages
1,000,000 rows · ms · 2026-10-15 08:22
The same kernels, at a hundred million rows
100,000,000 rows · ms · 2026-10-15 08:50
Against the libraries people reach for first
1,000,000 rows · ms · 2026-10-11 21:23
The same run, in energy
1,000,000 rows · mJ · 2026-10-11 21:23
Public data, from a path to a table
loads after the first, as text · ms · 2026-10-11 16:43
Over time
The same kernels at every run the ledgers kept. neo in white, the engine closest to it dashed.
Load a CSV, 1,000,000 rows
10.4 → 2.77 ms
3.8× quicker over 11 runs, 10-08 to 10-11 · Polars 15.2 ms at the last
Load a CSV, 10,000,000 rows
78.8 → 21.7 ms
3.6× quicker over 11 runs, 10-08 to 10-11 · Polars 114 ms at the last
Load a CSV, 100,000,000 rows
1,465 → 249 ms
5.9× quicker over 10 runs, 10-08 to 10-11 · Polars 1,186 ms at the last
Sort into a new table, 100,000,000 rows
1,483 → 744 ms
2.0× quicker over 10 runs, 10-08 to 10-11 · Polars 1,542 ms at the last
Measured on Apple M5 Max, 18 cores, 26.4.1. Polars, DuckDB, pandas, Spark and Arrow at their current releases, written the way their users write them; the Go, Rust, Swift and Zig ports on 16 or 18 threads, the better of the two.