Time to first render

Six engine configurations rendering their own native chart, from one million to two hundred million rows, on one machine on one day. The clock runs in the browser, from the request that starts the pipeline to a frame barrier after the render commits.

Traces
Axis
Data

Scaling across the full range

All three charts, both data sources, one million to two hundred million rows. The shaded band marks the sizes where every engine is bounded by fixed browser render cost rather than by the data, so the curves there say little about the engines. Switch the axis to log to read the growth rates: there a straight line is a power law.

Peak backend memory

Kernel high-water mark of the backend process. One cold, process-isolated trial per cell. The full range is shown, because the flatness is the result.

With an in-memory frame, FlexViz reads the caller's data zero-copy and streams the aggregation. Peak memory stays near 25 MB from 1M to 200M rows.

Parquet sources stream too. They are read lazily and never loaded in full. Peak memory stays flat as the row count grows. A 1B-row, 24 GB Parquet source drives a line and histogram dashboard, with zoom and cross-filter, in under 400 MB of resident memory. The test suite asserts this flatness for each trace with make test-ooc.

Box plots are the exception. Polars computes quantiles in memory.

The engines

Six server-compute engines. Each runs its own idiomatic workload for the same chart request. Mosaic-WASM and Perspective ran in the same matrix and are not charted: Mosaic-WASM computes on a single browser thread against thirty-two on the server engines, and Perspective draws only the first million rows.

Method

Each engine runs its own native workload, so they are not doing equal work and no equal-work speed claim follows from these numbers. Timing is the median of five warm repeats per cell, clocked browser-side to a frame barrier after the render commits; memory is a separate cold trial per cell. The harness, the correctness gates, the full per-trial results and the caveats are in the benchmark repository.