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.

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.

Rows
Show

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.