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.
All columns
Threads. Every engine gets the same 8 vCPU. Ibex
parallelises some operators by default, so ibex is not a
single-core number; ibex-st is the same build run with
IBEX_PARALLEL=0, which makes ibex vs
ibex-st Ibex's own threading gain. polars-st,
duckdb-st, datafusion-st and
clickhouse-st are the equivalent single-thread runs of their
engines, so ibex-st against those is the per-core comparison.
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.