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
Columns
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.