Benchmarks
How fast is Ibex?
Ibex against Polars, DuckDB, ClickHouse, DataFusion and data.table on the same columnar queries, from 1M to 50M rows. Times are the mean of timed iterations; lower is better.
Results
Per-query timings
Pick a row count and a metric. Each row is colour-scaled green→red against the best engine in that row — fastest for time, lightest for memory — and the best cell is outlined. Hover any cell for the exact time and peak memory.
Threads. Ibex runs on a single core. Polars, DuckDB,
DataFusion and ClickHouse use all 8 — so they win the parallelisable cells
on core count, not per-core work. For a same-core comparison read Ibex
against polars-st (Polars pinned to one thread); Ibex is faster
on the large majority of queries there.
Memory. The memory metrics show absolute peak resident set size (RSS) during a query's timed iterations — the footprint to run the op, including the already-resident input table — measured per process from the kernel's high-water mark. Multi-threaded engines trade memory for the parallel speed-ups noted above.
Caveats. Every engine now materialises its full result.
tf rolling EWMA is time-windowed in Ibex versus full-series in
Polars (both O(n), different maths). Each page is generated from a single
run; SQLite and the data.table rolling median/std
cells are omitted (they dominate wall-clock and add no competitive signal).
The code behind these numbers. Every query's exact code, in every engine, is on the Methodology & code page. Directly extracted from the harness source.