Latest · six architectural checkpoints ·

Evolving the C++ engine.

Selected SF1 query plans finish in 24–27% less command time and use about96% less peak memory with bounded batches. Selective native reads request72% fewer file bytes. All six scoped checkpoints are implemented and checked. The user accepted four reducers' measured 3.70% time benefit for the tested workload; the frozen 5% miss and one-reducer default remain recorded.

Current work · preserved baseline · small screens

Six engine checkpoints implemented and checked.

Checkpoint 1 / 6

Release consumed data

Kept · memory improvement

Raw bytes released after decode; single-run tables released after their last consumer. Repeated trials retain source inputs intentionally.

Checkpoint 2 / 6

Bounded batch pipelines

Kept · faster and smaller

Same three SF1 plans:24–27% less command time and96% less peak memory. All2,880,404 sales rows processed in44fact batches; two join builds reused. CSV control passed. Explicit supported batch mode.

Checkpoint 3 / 6

Read required columns

Kept · selective reads

CSV decodes one third of fields, using36% less peak memory. Optional .neo v3 selected reads request72% fewer file bytes, use45% less command time and54% less peak memory.

Checkpoint 4 / 6

Operator memory admission

Validated · tracked limits

Batch buffer, header, index and group admission fail explicitly at configured limits. Cast spills oversized retained blocks and charges known borrowed backing. These bounds are not a process-RSS ceiling.

Checkpoint 5 / 6

Adapt joins and aggregation

Validated · explicit adaptation

Join indexes build once across fact batches. Cast sizes tasks from observed input bytes and can sample groups to cap reducers. Larger automatic ceilings require an explicit setting; default is one.

Checkpoint 6 / 6

Multi-source Cast execution

Kept · workload-scoped R4 acceptance

Two-source broadcast join and grouped reducers: 7/7 exact outputs on four loopback workers. The user accepted the measured 3.70% lower full-command time with explicit four reducers for this workload. The original 5% benefit gate remains missed; the one-reducer default is unchanged.

Future speed experiments require at least 1% lower time, with correctness and control guards retained. Later Cast studies have separate results and baselines.

Checkpoint 1: observed changes

Baseline = 100 · lower uses less memory · two paired rounds

Q03-12.66% memory

Full-command time: +0.35%

Q52-10.64% memory

Full-command time: +2.63%

Q55-10.53% memory

Full-command time: -0.95%

CSV control-33.68% memory

Full-command time: -0.56%

Checkpoint 2: observed changes

Baseline = 100 · lower uses less memory · two paired rounds

Q03-96.02% memory

Full-command time: -25.68%

Q52-96.15% memory

Full-command time: -24.38%

Q55-96.13% memory

Full-command time: -27.17%

CSV control-0.20% memory

Full-command time: -0.17%

Small development screens against preserved C++ versions.44timed commands across four fixed screens, with warmups/controller overhead23.49seconds; correctness checks are separate. Exact answers and all observations retained. No Photon head-to-head, official TPC-DS score, significance or measured energy claim. Earlier 100GB/1TB forecasts below describe the prior whole-Table path, not this bounded batch executor. Each phase retains its own evidence; earlier studies below remain unchanged.

Same accepted engine · no code change

Three query plans, ten times the scale.

Measured at 3 sizes · winner preserved

Solid plots show measured full-command time at SF 0.1, 0.5 and 1. Dashed boxes show unrun scenarios for nominal 100 GB and 1 TB. Those targets are 100× and 1,000× beyond the largest measured scale.

18 timed commands + 1 explicit preflight · 13.12 seconds total · two fixed runs per query and scale. Shared-machine medians; no significance claim.

Measured · all three scales

Q3

Manufacturer 128 · November · all years

Full command · seconds · lower is better
1.28 s00.148SF 0.10.636SF 0.51.28SF 1

Largest measured scale: 613 MiB peak memory; 578 ms decode and 146 ms processors.

Forecast scenarios · not executed

100 GB · SF 100 nominal

~2.09 min

Affine reference

Time scenarios: 2.09 min – 2.47 min.

Peak memory scenarios: 54.4–67.6 GiB.

Memory alone does not establish feasibility.

1 TB · SF 1000 nominal

~20.9 min

Affine reference

Time scenarios: 20.9 min – 24.7 min.

Peak memory scenarios: 518–676 GiB.

Even the low memory scenario reaches total RAM.

Measured · all three scales

Q52

Manager 1 · November 2000

Full command · seconds · lower is better
1.28 s00.143SF 0.10.629SF 0.51.25SF 1

Largest measured scale: 613 MiB peak memory; 581 ms decode and 124 ms processors.

Forecast scenarios · not executed

100 GB · SF 100 nominal

~2.06 min

Affine reference

Time scenarios: 2.03 min – 2.38 min.

Peak memory scenarios: 54.4–66.2 GiB.

Memory alone does not establish feasibility.

1 TB · SF 1000 nominal

~20.5 min

Affine reference

Time scenarios: 20.0 min – 23.8 min.

Peak memory scenarios: 519–662 GiB.

Even the low memory scenario reaches total RAM.

Measured · all three scales

Q55

Manager 28 · November 1999

Full command · seconds · lower is better
1.28 s00.143SF 0.10.623SF 0.51.25SF 1

Largest measured scale: 613 MiB peak memory; 585 ms decode and 120 ms processors.

Forecast scenarios · not executed

100 GB · SF 100 nominal

~2.05 min

Affine reference

Time scenarios: 2.05 min – 2.39 min.

Peak memory scenarios: 54.4–66.2 GiB.

Memory alone does not establish feasibility.

1 TB · SF 1000 nominal

~20.5 min

Affine reference

Time scenarios: 20.5 min – 23.9 min.

Peak memory scenarios: 518–662 GiB.

Even the low memory scenario reaches total RAM.

Nominal scale describes the source dataset, not bytes loaded. Each plan reads three projected tables. The memory reference is this 128 GiB machine’s total RAM; available memory is lower. A scenario range is a model envelope, not a confidence interval.

Every measured clock, physical input size and forecast method
Measured medians only. Full-command seconds, decode milliseconds and processor milliseconds have different scopes.
Query / SFCommand sDecode msProcessor msPeak MiBGroups → answer
Q3 / 0.10.14865.018.169.215 → 15
Q3 / 0.50.63628674.031146 → 46
Q3 / 11.2857814661389 → 89
Q52 / 0.10.14364.713.267.811 → 11
Q52 / 0.50.62929163.031160 → 60
Q52 / 11.25581124613109 → 100
Q55 / 0.10.14364.713.067.820 → 20
Q55 / 0.50.62328861.031158 → 58
Q55 / 11.25585120613104 → 100

Measured SF 0.1 (100 MB nominal): 26.2 MB of projected JSON; 288,464 sales, 73,049 date and 1,800 item rows.

Measured SF 0.5 (500 MB nominal): 118 MB of projected JSON; 1,441,375 sales, 73,049 date and 9,000 item rows.

Measured SF 1 (1 GB nominal): 234 MB of projected JSON; 2,880,404 sales, 73,049 date and 18,000 item rows.

Forecast 100 GB · SF 100 nominal: ~23.1 GB projected JSON, with 23.1 GB–26.2 GB across scenarios. This volume has not been generated or loaded.

Forecast 1 TB · SF 1000 nominal: ~231 GB projected JSON, with 231 GB–262 GB across scenarios. This volume has not been generated or loaded.

Full command includes startup, file reads, decoding, all native stages, result writing and cleanup via existing scale_rounds.run. Decode excludes file reads; processor is the sum of native stage clocks. Fresh processes after one explicit executable-path correctness warmup; generated inputs may be in the OS file cache.

Affine reference scenario: nonnegative affine least-squares fit to all three measured medians versus nominal scale factor. Range: scenario envelope also including origin-linear extrapolation from each size and a power curve through the two larger sizes when nondecreasing. No statistical coverage guarantee or confidence interval.

All 19 native outputs, including the explicit preflight, match independent ordered SQL references exactly in integer cents. The same SQL parameters and native stage objects are used at every size. Guards cover exact sums, dimension keys, NULL grouping, full group counts and order ties.

Nominal TPC-DS SF 100 / SF 1000 represent 100 GB / 1 TB scale labels, not that many bytes read by these projected plans. Targets are 100× / 1000× beyond the largest measured scale. Generator dimensions, selectivity, memory pressure, file storage, spill and distribution can change the curve. These resident-memory timing scenarios do not establish local runnability.

Two fixed runs per query/size, reversed order in the second round. No retries, exclusions or engine changes. Production source stayed unchanged; the accepted winner remains active.

Only three required-column projections are loaded, with no rows prefiltered, joined or aggregated before native execution. Export-size scenarios are estimates, not actual generated target-size files.

Current evaluator retains inputs and intermediate tables and has no operator memory budget/spill path. Forecast memory exceeding 128 GiB cannot fit this machine without changing execution or infrastructure.

Selected local plans; no official TPC-DS score, Photon comparison, new language-race result or measured energy claim.

Engine source: 99f29a94f7f9da1ea14077a8db3aac678e6a4f9d. Executable SHA-256: 0758f148b4240069660ea21026bf6287f3abf6561599aa93c8b9f23f57875daa.

The engine is unchanged in this study. These selected native plans do not establish an official TPC-DS score, general SQL support, or a Photon / competitor speed advantage.

All measured samples, domain checks and forecast scenarios →

Previous kept improvement · repeated commands after validation · SF 0.1

Stream into columns with fewer temporary copies.

Kept · 16 / 16 guards passed

Strict streaming JSON writes directly into columns with lazy missing-cell padding; raw CSV dictionary spans avoid one temporary copy while scratch is immediately owned; exact case-sensitive literal replacement uses substring search. The CSV workflow is fixed, but its parser and replacement code change. Same SF 0.1 input bytes and full query graphs; previous winner preserved.

2 explicit correctness warmups + 16 timed native calls · 4.56 seconds total in this final screen. Two explicit Q3 correctness warmups at the final saved executables precede 16 fixed timing calls (two reversed-order pairs per case, repeat = 1). No retries, sample exclusions, pooling or threshold changes. All startup/read/decode/processor/output/cleanup costs stay inside every timed command. Outcome applies to repeated commands after validation, not first install/launch.

Query target · all guards passed

Q3 · selected TPC-DS plan

Input decoding-49.30% time
Full command-29.99% time

Decode medians: 136.90 → 69.36 ms. Command medians: 225.55 → 157.85 ms.

Peak process memory: -68.90% · 222.4 → 69.2 MiB.

Processor time: +4.63% · within preset bound.

Query target · all guards passed

Q52 · selected TPC-DS plan

Input decoding-49.18% time
Full command-31.11% time

Decode medians: 133.42 → 67.79 ms. Command medians: 218.38 → 150.44 ms.

Peak process memory: -69.52% · 222.1 → 67.7 MiB.

Processor time: -9.05% · within preset bound.

Query target · all guards passed

Q55 · selected TPC-DS plan

Input decoding-47.20% time
Full command-27.36% time

Decode medians: 135.43 → 71.53 ms. Command medians: 219.22 → 159.29 ms.

Peak process memory: -69.53% · 222.3 → 67.7 MiB.

Processor time: -1.99% · within preset bound.

CSV workflow · all guards passed

CSV pipeline · fixed workflow guard

Input decoding+0.26% time
Full command+0.06% time

Decode medians: 7.46 → 7.47 ms. Command medians: 142.51 → 142.60 ms.

Peak process memory: -1.05% · 257.7 → 254.9 MiB.

Processor time: +2.55% · within preset bound.

All 16 case/metric guards passed. CSV decode +0.26%, processor +2.55%, command +0.06% and memory -1.05% remain within the preset +5% bounds.

Decode excludes raw file reading and times source-to-Table construction. Processor time sums all native stages. Full command includes startup, reading, decode, processors, output, cleanup and existing runner overhead. Peak RSS is the whole process high-water memory footprint. Bars use baseline 100 on a common 0–125 scale. Median of two within-pair candidate/baseline ratios. Separate medians are descriptive and not used to calculate paired percentages. Preliminary shared-Mac screen; no confidence interval.

27 focused cases / 527 assertions passed. All 14 query outputs (including preflights) match full ordered exact-cent SQL references; all 4 timed CSV outputs agree. Prior 6 CSV + 7 Find/Replace goldens are retained for unchanged source-specific implementations.

Selected SF0.1 native plans on a shared Mac, not general SQL/DECIMAL support, an official TPC-DS score, a Photon/language comparison or formal qualification. Energy/power was not measured.

Two earlier failed attempts and the measurement correction

Both earlier failed screens are retained below and were rolled back. The last exposed asymmetrical first-use executable paths; final protocol prospectively validates both paths. This is a new source candidate, not a replacement sample. Preflight walls are not matched cold-start data. All three screens together used 50 comparison/validation launches in 13.09 seconds; correctness tests are separate.

CSV dictionary ownership · rolled back

CSV workflow: processor: +5.47%. Both pairs remain in the evidence.

Add literal replacement search · rolled back

Q3: command: +14.13%. Both pairs remain in the evidence.

All attempts, warmups, pairs and guards →

Earlier · preliminary paired input screen · SF 0.1

Stream JSON directly into columns.

Rolled back · CSV decode guard missed

Reuse the existing streaming reader instead of building an intermediate JSON object tree. Same input files and query plans; the previous winner is preserved. The candidate below is not shipped.

16 native calls · 4.42 seconds total · two fixed baseline/candidate pairs per case, reversed order in pair two. Median within-pair time ratios; preliminary descriptive screen.

Query target · guards passed

Q3 · selected TPC-DS plan

Input decoding-48.91% time
Full command-25.36% time

Decode medians: 138.34 → 70.67 ms. Command medians: 331.51 → 254.48 ms.

Processor time: -7.04% · within preset bound · unchanged processors.

Query target · guards passed

Q52 · selected TPC-DS plan

Input decoding-47.86% time
Full command-30.04% time

Decode medians: 137.36 → 71.58 ms. Command medians: 223.37 → 156.21 ms.

Processor time: -2.20% · within preset bound · unchanged processors.

Query target · guards passed

Q55 · selected TPC-DS plan

Input decoding-50.05% time
Full command-32.04% time

Decode medians: 142.81 → 71.33 ms. Command medians: 230.39 → 156.58 ms.

Processor time: +1.54% · within preset bound · unchanged processors.

Unchanged CSV control · guard missed

CSV pipeline · unchanged control

Input decoding+10.41% time
Full command-0.87% time

Decode medians: 6.81 → 7.52 ms. Command medians: 140.76 → 139.44 ms.

Processor time: -8.23% · within preset bound · unchanged processors.

The CSV decoding control moved +10.41%, exceeding the preset +5% limit. We rolled back. This small screen does not establish why unchanged CSV code moved; query gains remain experimental.

Decode times only source-to-Table construction; raw file reads precede it. Processor time sums all native stage clocks. Full command includes startup, reads, decode, processors, output, cleanup and runner overhead. All boundaries are unchanged. Bars use baseline 100 on a common 0–125 index scale; raw medians above are descriptive and need not produce the paired percentage.

12 focused cases / 226 assertions pass. All 12 timed query outputs match full ordered exact-cent SQL answers; all 4 CSV control outputs agree. No full-suite qualification claimed. Production sources and both active executables exactly match the preserved baseline. Candidate source, patch, binaries and all evidence remain available.

Two fixed pairs per case, both retained. No warmups/retries/exclusions/cacheflush/resampling. Changes use median within-pair ratios, not ratios of separate medians. Unchanged control movement is not an adopted gain or proof of a causal regression. This is not an official TPC-DS score or a Photon comparison.

Both pairs, guards and rollback evidence →

Earlier · selected query pilot · SF 0.1

TPC-DS query plans: first verified baseline.

3 / 3 matched · first baseline

DuckDB v1.5.6 generated data, scale factor 0.1. All 288,464 sales rows, 73,049 date rows and 1,800 item rows are retained; only required columns are loaded. Hand-mapped native plans cover three related revenue queries.

Median of three runs per query. 9 query timing calls + 6 legacy control calls · 3.89 seconds total. Both clocks below share the same millisecond scale.

Ordered answer matched · exact cents

Q3 · Manufacturer and brand revenue

Manufacturer 128 · November

17.84ms

native processor stages · median

Q3: processor versus full command wall clocks

Input decode: 133.96 ms median. 138 qualifying sales → 15 answer rows.

Ordered answer matched · exact cents

Q52 · Brand revenue in 2000

Manager 1 · November 2000

14.40ms

native processor stages · median

Q52: processor versus full command wall clocks

Input decode: 134.05 ms median. 112 qualifying sales → 11 answer rows.

Ordered answer matched · exact cents

Q55 · Brand revenue in 1999

Manager 28 · November 1999

14.50ms

native processor stages · median

Q55: processor versus full command wall clocks

Input decode: 134.08 ms median. 250 qualifying sales → 20 answer rows.

Processor time sums all native stage clocks. Input decode is separate. Command wall includes startup, input reading/decoding, processors, output and cleanup, plus runner overhead. Medians are separate measurements and are not additive.

All nine timed outputs match the SQL reference. 11 correctness calls passed, including a separate 101-row limit/tie check. The unchanged legacy control stayed within its 5% bound; its -2.38% movement is not an adopted gain.

The engine is unchanged. Named inputs extend the existing evaluator; native plans use exact integer cents with checked bounds. This is a small selected-query pilot, not general SQL/DECIMAL support, an official TPC-DS score, or a Photon comparison.

Query results, scope and timing evidence →

Earlier preliminary processor screen ·

Stop copying columns that cleaning immediately replaces.

Kept · new winner

Every workflow starts with 1,000,000 input rows. Actual production Find/Replace steps feed numeric or text filtering and aggregation on the existing synthetic CSV. The previous date-string winner is preserved. This change removes copied data that would immediately be discarded.

Baseline: the accepted C++ build before this attempt. The clock sums every processor stage; CSV parsing, final serialization, startup and graph bookkeeping are excluded. 18 native calls · 3.90 seconds total · Median of three within-pair candidate/baseline processor-time ratios per case; preliminary descriptive screen.

Primary target

1M input rows · two cleanups → filter → summarize

-18.77%

paired processor time · lower is better

1M input rows · two cleanups → filter → summarize: paired time indices

Screen bound passed

Target pipeline

1M input rows · clean notes → filter → summarize

-23.52%

paired processor time · lower is better

1M input rows · clean notes → filter → summarize: paired time indices

Screen bound passed

Unchanged control

1M input rows · summarize by region

+0.46%

paired processor time · lower is better

1M input rows · summarize by region: paired time indices

Within control bound · unchanged code

Correctness: 48 focused native cases / 2,274 assertions passed. Frozen replay: 7 / 7, with 0 known mismatches and 0 database cases skipped.

This small screen is preliminary evidence for these C++ processor workloads. It is not formal qualification or a new comparison with another language or Photon. Unchanged control movement is not an adopted gain.

Pipeline replacement-copy screen evidence →

Earlier preliminary processor screen ·

Build date strings in one append pass.

Kept · new winner

Replace repeated date-string rewrites with one append pass, including date/group header aliases. The current grouped numeric-builder winner is preserved as the baseline. Same small workloads and existing tooling; all prior evidence stays available.

Baseline: the accepted C++ build before this attempt. The transform clock includes grouping, date handling, numeric construction and final row gathering; CSV parsing and result serialization are excluded. 18 native calls · 2.40 seconds total · Median of three within-pair candidate/baseline processor-time ratios per case; preliminary descriptive screen.

Primary target

16,384 input rows → 8,192 groups · two running sums

-94.95%

paired processor time · lower is better

16,384 input rows → 8,192 groups · two running sums: paired time indices

Screen bound passed

Target processor

8,192 input rows → 4,096 groups · one running sum

-90.94%

paired processor time · lower is better

8,192 input rows → 4,096 groups · one running sum: paired time indices

Screen bound passed

Unchanged control

16,384 input rows · ungrouped control

-1.03%

paired processor time · lower is better

16,384 input rows · ungrouped control: paired time indices

Within control bound · unchanged code

Correctness: 26 focused native cases / 1,883 assertions passed. Frozen replay: 11 / 11, with 0 known mismatches and 0 database cases skipped.

This small screen is preliminary evidence for these C++ processor workloads. It is not formal qualification or a new comparison with another language or Photon. Unchanged control movement is not an adopted gain.

Date-string builder screen evidence →

Earlier preliminary processor screen ·

Build grouped running sums without repeated rewrites.

Kept · new winner

Grouped numeric result columns reuse existing sum buffers, then append once in original group order. Final reordering, date-string writes and collision fallbacks stay unchanged. Small cases use two input rows per group and 820 / 410 date partitions.

Baseline: the accepted C++ build before this attempt. The transform clock includes grouping, date handling, numeric construction and final row gathering; CSV parsing and result serialization are excluded. 18 native calls · 3.25 seconds total · Median of three within-pair processor-time ratios per case.

Primary target

16,384 input rows → 8,192 groups · two running sums

-48.25%

paired processor time · lower is better

16,384 input rows → 8,192 groups · two running sums: paired time indices

Screen bound passed

Target processor

8,192 input rows → 4,096 groups · one running sum

-29.41%

paired processor time · lower is better

8,192 input rows → 4,096 groups · one running sum: paired time indices

Screen bound passed

Unchanged control

16,384 input rows · ungrouped control

+0.48%

paired processor time · lower is better

16,384 input rows · ungrouped control: paired time indices

Within control bound · unchanged code

Correctness: 26 focused native cases / 1,871 assertions passed. Frozen replay: 11 / 11, with 0 known mismatches and 0 database cases skipped.

This small screen is preliminary evidence for these C++ processor workloads. It is not formal qualification or a new comparison with another language or Photon. Unchanged control movement is not an adopted gain.

Grouped running-sum screen evidence →

Earlier preliminary processor screen ·

Build running sums in one append pass.

Kept · new winner

Fresh running-sum result columns now reuse their private output storage and append each value once. Three fixed pairs per case use small repetitions of the existing dated example data.

Baseline: the accepted C++ build before this attempt. The transform clock includes date sorting, row gathering and running-sum construction; CSV parsing and result serialization are excluded. 18 native calls · 2.53 seconds total · Median of three within-pair processor-time ratios per case.

Primary target

Two running sums · 16,384 rows

-99.12%

paired processor time · lower is better

Two running sums · 16,384 rows: paired time indices

Screen bound passed

Target processor

One running sum · 4,096 rows

-95.87%

paired processor time · lower is better

One running sum · 4,096 rows: paired time indices

Screen bound passed

Unchanged control

Grouped running sum · 16,384 rows

+1.66%

paired processor time · lower is better

Grouped running sum · 16,384 rows: paired time indices

Within control bound · unchanged code

Correctness: 24 focused native cases / 1,649 assertions passed. Frozen replay: 11 / 11, with 0 known mismatches and 0 database cases skipped.

This small screen is preliminary evidence for these C++ processor workloads. It is not formal qualification or a new comparison with another language or Photon. Unchanged control movement is not an adopted gain.

Running-sum screen evidence →

Earlier preliminary processor screen ·

Reuse work across pipeline steps.

Rolled back · winner restored

Three workflows on the same million-row synthetic CSV using existing production processors. Current winner kept as the baseline; no retries or extra samples.

Baseline: the accepted C++ build before this attempt. The clock covers all processor stages and excludes CSV parsing and result serialization. 18 native calls · 10.59 seconds total · Median of three within-pair time ratios per workflow.

Primary target

Sort → filter → sort → summarize

-9.37%

paired processor time · lower is better

Sort → filter → sort → summarize: paired time indices

Screen bound passed

Target pipeline

Filter → summarize → join → sort

-2.14%

paired processor time · lower is better

Filter → summarize → join → sort: paired time indices

Screen bound passed

Unchanged control

Summarize by region

+89.77%

paired processor time · lower is better

Summarize by region: paired time indices

Outside control bound · unchanged code

Correctness: 965 native cases / 362,691 assertions passed. Frozen replay: 634 / 641, with 7 known mismatches and 14 database cases skipped.

This small screen is preliminary evidence for these C++ processor workloads. It is not formal qualification or a new comparison with another language or Photon. Unchanged control movement is not an adopted gain.

Pipeline screen evidence →

Earlier sort attempts · · three paired runs · 1,000,000 rows

Earlier sort ideas, both rolled back.

Each attempt compares a proposed change with its earlier C++ baseline. Sorting is the target; filtering and summing are controls whose movement is not credited to the sort change. All four measurements are shown. Lower time is better; a small screen is preliminary evidence.

Both sort ideas were rolled back. Filter and sum used unchanged code. Their timing variations—including results previously shown in green—do not represent adopted improvements or evidence of combined “hybrid” gains.

Write final sort indices directly

Rolled back · baseline restored

6 suite processes · 56.65 seconds total

Sort row order+11.98% time

Screen check missed

Build a sorted table+7.50% time

Screen check missed

Filter rowsUnchanged control-12.00% time

Within control bound · unchanged code

Sum by regionUnchanged control0.00% time

Within control bound · unchanged code

964 native cases passed (362,615 assertions). Frozen replay: 634/641, the same seven known transcript mismatches; 14 database cases skipped.

Attempt evidence →

Use smaller sort histograms

Rolled back · baseline restored

6 suite processes · 56.68 seconds total

Sort row order-0.47% time

Screen check missed

Build a sorted table-1.33% time

Screen check passed

Filter rowsUnchanged control+10.00% time

Outside control bound · unchanged code

Sum by regionUnchanged control+5.00% time

Within control bound · unchanged code

964 native cases passed (362,619 assertions). Frozen replay: 634/641, the same seven known transcript mismatches; 14 database cases skipped.

Attempt evidence →

Bars show paired time indices with each attempt’s baseline at 100. These short internal C++ checks are not formal qualification or a fresh comparison with another language or Photon.

How to read these attempts
  • The changes apply PhD lessons about redundant writes, allocation, scratch reuse and cache-sized work. Both earlier winning designs remain present.
  • Each attempt used three fixed matched pairs: baseline/candidate, candidate/baseline, then baseline/candidate. Every result is retained, with no retries, extension, exclusion or pooling.
  • Time change is 100 × (median of three within-pair candidate/baseline ratios − 1). These are descriptive development screens, without confidence intervals or formal nonregression qualification.
  • The fixed rule requires sorting row order to take at least 5% less time, and every other target or control no more than 5% more time. A ratio of 1.05 passes inclusively. Filter and sum changes are not credited or causally blamed on the sort code.
  • All timing ran on a shared Mac. Each attempt used six suite processes; the existing suites repeat kernels internally. Both optimization attempts together used 12 timed suite processes. The earlier language-reference check is separate.
  • The smaller-window design used 75% less histogram storage for small inputs, without a useful measured speed gain. All core and test sources and the accepted benchmark executable were verified exact after rollback.
  • Prior versions, complete raw logs, candidate source and runnable binaries are backed up in the NEON research repository; the public JSON includes every paired timing needed to recompute these four results.
  • No fresh competitor or Photon measurement was made. Next work should target repeated typing/copying in real pipelines, partitioned joins/aggregation, memory limits/spill, pruning and adaptation.

Earlier same-day check · saved October 15 references

Earlier language-reference spot-check

Measured Oct 27, 2026, 5:26 PM CDT · 3 timed suite processes plus 1 correctness check · 28 seconds total. Rust, Swift, Zig and Go keep their saved measurements; they were not rerun.

C++ shows the median of the three earlier suite-process measurements. Each comparison describes that measured build against a saved port. Times are milliseconds; shorter bars mean less time, on a shared scale within each row.
WorkloadC++ measuredRust savedSwift savedZig savedGo saved
Filter rows (amount > 500)0.026 msC++ 1.42× faster0.037 msC++ 1.62× faster0.042 msC++ 1.15× faster0.030 msC++ 2.46× faster0.064 ms
Sort row order4.22 msC++ 3.80× slower1.11 msC++ 3.70× slower1.14 msC++ 3.05× slower1.39 msC++ 2.84× slower1.49 ms
Build a sorted table6.79 msC++ 1.75× slower3.89 msC++ 1.10× faster7.50 msC++ 1.63× slower4.17 msC++ 1.16× slower5.85 ms
Sum by region0.023 msC++ 1.83× faster0.042 msC++ 1.35× faster0.031 msC++ 1.04× faster0.024 msC++ 3.43× faster0.079 ms

At this earlier check, the kernels were unchanged. These preliminary timings on a shared Mac do not attribute a kernel speed gain to the Cast workflow upgrades. There is no fresh foreign-language or Photon run here.

Spot-check samples, scope and source
  • Fresh C++ timings on October27; Rust, Swift, Zig and Go timings are the fixed published October15 references. No foreign-language benchmark was rerun.
  • Three suite-process measurements per operation, summarized by their median, plus one table-digest correctness check. Each existing suite repeats kernel variants internally; this is a small descriptive check, without a confidence interval or formal regression verdict.
  • All four processes exited successfully. The million-row, six-column table digest and all three suite output checks agree with the saved checks.
  • Measured on a shared Mac; every sample is retained. WindowServer appeared above half a CPU core at the correctness and third-suite condition snapshots; one-minute load rose from 2.29 to 6.05. No cause for the observed timing differences has been established.
  • Core kernels are unchanged since the historical source. Recent Cast workflow gains cannot be applied to these kernel ratios. No rollback is made from this measurement-only check.
  • The original comparison uses benchmark ports on one synthetic CSV shape. The C++ filter returns a bitmap while the ports return row-number lists. This is not a claim that a language or complete product is universally faster.
  • CSV loading was not remeasured: the suite reports its minimum, while the saved comparison used the median of timed loads. The original saved load row remains below.
  • Matching October15 raw logs are unavailable in this checkout. Published references and the separate October12 raw checks are preserved without combining their timing records.

Filter rows (amount > 500) · C++ suite samples: 0.031, 0.021, 0.026 ms · saved C++ 0.018 ms · observed time change +44.44%. This cross-date change is descriptive.

Sort row order · C++ suite samples: 2.07, 4.22, 5.21 ms · saved C++ 1.04 ms · observed time change +306.74%. This cross-date change is descriptive.

Build a sorted table · C++ suite samples: 4.75, 6.79, 8.28 ms · saved C++ 2.85 ms · observed time change +138.32%. This cross-date change is descriptive.

Sum by region · C++ suite samples: 0.023, 0.024, 0.021 ms · saved C++ 0.020 ms · observed time change +15.00%. This cross-date change is descriptive.

Read the spot-check evidence →

Saved language comparison · 2026-10-15 08:22

C++ alongside Rust, Swift, Zig and Go.

All engine comparisons →

1,000,000 rows; saved measurements on Apple M5 Max, 18 cores, 26.4.1

Times in milliseconds; shorter bars mean less time. Multiples are the other language’s time divided by C++ time, so values above 1 favor C++. Bars share a scale within each row.
WorkloadC++RustSwiftZigGo
Load typed CSV2.89 ms1.22×3.53 ms1.14×3.29 ms1.39×4.03 ms1.72×4.98 ms
Filter rows0.018 ms2.06×0.037 ms2.33×0.042 ms1.67×0.030 ms3.56×0.064 ms
Sort row order1.04 ms1.07×1.11 ms1.10×1.14 ms1.34×1.39 ms1.43×1.49 ms
Build a sorted table2.85 ms1.36×3.89 ms2.63×7.50 ms1.46×4.17 ms2.05×5.85 ms
Sum by region0.020 ms2.10×0.042 ms1.55×0.031 ms1.20×0.024 ms3.95×0.079 ms

These are the last published language measurements, not a new run today. Core kernel code is unchanged; recent measured improvements are in the Cast workflows below. Saved other-language time divided by saved C++ time. A ratio above 1 favors C++. It is not a new win or a universal language ranking.

Accepted C++ improvements

What improved since then.

Each result uses its own prior C++ baseline, workload and clock. Percentages are separate studies and must not be multiplied or applied to the language ratios. All studies ran on a shared Mac with loopback workers.

Build many-group results without repeated copying

93.3%

less paired time · Native job time

250,000 rows and distinct groups; sum, average, min, max and count

Against the earlier numeric partial-column builder in the same workflow.
Earlier C++ · 100Updated C++ · 6.69Paired index · lower is better · line = adjusted interval

Change interval [-94.43%, -91.96%]

11 / 11 controls passed · 288 exact-output calls

Method and evidence →

Avoid checking the same completed result repeatedly

32.2%

less paired time · Native job time

One-million-row count and join

Against the previous accepted C++ result-reporting implementation.
Earlier C++ · 100Updated C++ · 67.76Paired index · lower is better · line = adjusted interval

Change interval [-38.45%, -25.39%]

11 / 11 controls passed · 2,400 exact-output calls

Method and evidence →

Finish small jobs without waiting on sleeping threads

94.7%

less paired time · Full command: startup through exit

Small pipeline

Against the previous accepted C++ build, on the same small pipeline.
Earlier C++ · 100Updated C++ · 5.35Paired index · lower is better · line = adjusted interval

Change interval [-96.75%, -91.21%]

23 / 23 controls passed · 2,400 exact-output calls

Method and evidence →

The command-completion result removes idle shutdown waits; it does not measure faster filter, sort or sum kernels. These are internal C++ studies, with each study’s machine and execution scope in its evidence.

Experiment evidence and history

Version IDs, release decisions, all endpoint results and earlier rejected candidates are retained here. The latest accepted follow-up is shown first.

Evidence for the three accepted improvements

The headline estimates use paired timing analysis. The individual-call medians below are descriptive and are not the source of those percentages. Contended calls were retained.

Build many-group results without repeated copying

250,000 rows and distinct groups; sum, average, min, max and count · Native job time. Against the earlier numeric partial-column builder in the same workflow. Control gates covered native wall time; full-command timing was descriptive.

Paired change -93.31% · adjusted interval [-94.43%, -91.96%]

Individual-call medians: 5,616.636 → 413.492 ms · 288 exact-output calls · 157 contended

11 / 11 controls passed

Avoid checking the same completed result repeatedly

One-million-row count and join · Native job time. Against the previous accepted C++ result-reporting implementation. This removes duplicate reporting work; operator kernels are unchanged.

Paired change -32.24% · adjusted interval [-38.45%, -25.39%]

Individual-call medians: 417.415 → 310.551 ms · 2,400 exact-output calls · 1,694 contended

11 / 11 controls passed

Finish small jobs without waiting on sleeping threads

Small pipeline · Full command: startup through exit. Against the previous accepted C++ build, on the same small pipeline. This improves lifecycle responsiveness; operator kernels and timer boundaries are unchanged.

Paired change -94.65% · adjusted interval [-96.75%, -91.21%]

Individual-call medians: 1.032363 → 0.038535 s · 2,400 exact-output calls · 1,925 contended

23 / 23 controls passed

Source identifiers and measurement scope

Future changes use targeted correctness checks and small exploratory timing screens. Larger qualification runs wait for an explicit request. New native invocations for this overview: 0.

historical language data sha256
26aacea70db62f9bd5f9528187ba09c25cfbd45feaab72c71c8d49f94d2ff70f
aggregation decision sha256
ef79857c6d81407e618e35b5103e547af3420e6e07374897781f5998153297cc
verification study sha256
6caad4c03d6effc2c5ea5f1e0f4f9bc4d5db6d644a3fba7d7a0a19f99c05f154
shutdown study sha256
76effcadc798767fd0f5eec38cd43bb7b5dd867974cdf975c63e8484e8a87d96
kernel source audit sha256
2d19c01e92fcab7d4a29f3f1fbfa1422d58042fb84651aabdc9343b265ff3cda
kernel reference source
369589d0009f7358310b84fd48e29dad947ff477
aggregation source
35f5e62f
latest accepted source
97d2ead89b8cbae1a46effed7738de9a106077b4

Completed study · V13 · kept

V13 accepted: every gate passed

V13 is retained as the accepted version; V11 remains the immutable comparison baseline.

Comparison baseline: immutable V11

V13 interrupts idle shutdown waits. The operator kernels and both timer boundaries are unchanged; this is a lifecycle result.

Full command · small pipeline

-94.65%

V11 · baseline 100V13 · 5.350 · lower is better · line = adjusted interval

[-96.75%, -91.21%] · Gate passed

Native wall · small pipeline

-93.90%

V11 · baseline 100V13 · 6.100 · lower is better · line = adjusted interval

[-95.45%, -91.81%] · Gate passed

Both graphs compare V13 with immutable V11 on the same small-pipeline case. Full command includes startup through exit; native wall retains its narrower leader boundary. Bars show paired indices, not raw medians. These results do not change earlier study or language measurements.

23 / 23 controls passed

11 / 11 full-command controls · 12 / 12 native-wall controls · 2,400 exact outputs

V13 primary paired full-command time changed -94.65% versus immutable V11. The primary and all 23 controls passed the frozen rule; V13 was kept.

The three earlier misses now meet the bound.

These were V12’s native-wall misses. Here each is measured anew in V13 against immutable V11. Zero means the same time as V11; an adjusted upper bound at or below +5% is required. V12 remains rejected.

Count by product + join · 1M

-22.89% native wall

-30.00%0 · V11+5% gate

[-29.00%, -16.25%] · Pass

Inferred join keys · 1M

-23.26% native wall

-30.00%0 · V11+5% gate

[-29.42%, -16.56%] · Pass

Count + join default control · 1M

-21.13% native wall

-30.00%0 · V11+5% gate

[-29.05%, -12.33%] · Pass

Inspect all 24 endpoint results

Each workflow has two clocks. The full-command primary needs an adjusted upper bound ≤ −20% and p < 0.05 / 24; every other upper bound must be ≤ +5%. Intervals are paired-t approximations on block log ratios, Bonferroni-adjusted across all 24 endpoints. Exact sign swaps apply to the p-values.

Paired change and adjusted interval; all 24 results, with the former V12 misses flagged.
WorkflowFull commandCommand gateNative wallWall gate
Count by product + join · 250k-86.41%[-89.78%, -81.93%]Pass-41.43%[-46.97%, -35.30%]Pass
Count by product + join · 1MV12 native-wall miss · V13 pass-60.24%[-66.46%, -52.86%]Pass-22.89%[-29.00%, -16.25%]Pass
Filter + aggregate + join · 250k-78.58%[-81.53%, -75.15%]Pass-19.27%[-24.96%, -13.14%]Pass
Filter + aggregate + join · 1M-63.07%[-69.31%, -55.56%]Pass-13.30%[-18.42%, -7.86%]Pass
Small pipelineFull-command primary-94.65%[-96.75%, -91.21%]Pass-93.90%[-95.45%, -91.81%]Pass
Duplicate join keys · 64-95.03%[-97.14%, -91.37%]Pass-94.26%[-95.43%, -92.79%]Pass
Empty right input · 64-92.36%[-96.21%, -84.58%]Pass-94.35%[-95.48%, -92.93%]Pass
Empty left input · 64-93.58%[-97.06%, -85.97%]Pass-93.86%[-95.24%, -92.08%]Pass
Pipeline + sort · 1M-63.67%[-68.71%, -57.83%]Pass-11.82%[-15.25%, -8.25%]Pass
Inferred join keys · 1MV12 native-wall miss · V13 pass-58.93%[-66.01%, -50.37%]Pass-23.26%[-29.42%, -16.56%]Pass
Count + join default control · 1MV12 native-wall miss · V13 pass-59.97%[-66.22%, -52.56%]Pass-21.13%[-29.05%, -12.33%]Pass
Sum + sort · 1M-93.97%[-94.85%, -92.94%]Pass-75.65%[-81.32%, -68.25%]Pass
All 24 endpoints, decision and evidence →

Earlier experiments · retained history

These are the earlier trial decisions. The V13 follow-up above is the current accepted version.

Cast V11

Accepted · prior baseline

32.2%

lower paired native wall time

Million-row count + join

Leader execution + result verification · baseline = 100
Previous accepted C++100V1167.80 · lower is better100 · baseline

Thin line: adjusted interval. Paired change -32.24% [-38.45%, -25.39%].

11 / 11 controls passed. Retained as the immutable V13 comparison baseline.

See the V11 evidence →

Cast V12

Earlier trial · rejected

87.4%

lower paired full-command time

Small pipeline · shutdown experiment

Command startup through final exit · baseline = 100
Accepted V11100V12 candidate12.60 · lower is better100 · baseline

Thin line: adjusted interval. Paired change -87.40% [-89.73%, -84.53%].

Historical V12 decision: 20 / 23 controls passed, so V11 was restored then. V13 now retains the worker shutdown fix and passes every control.

Accepted V13 follow-up · 23 / 23 controls passed ↑See the V12 evidence →

Each chart has its own baseline, workflow and clock. V11 measures native wall time; V12 measures full-command completion. The percentages are separate studies and are not chained into a cumulative speed claim.

Earlier decision · V12

A faster command still has to pass every control.

In the earlier V12 trial, 20 of 23 controls passed. 3 native-wall intervals did not establish the required +5% nonregression bound, so that candidate was rejected. V13 subsequently passed all 23 controls under the same bound.

2,400 / 2,400
exact outputs · complete trial
20 passed3 bound not established9 / 12 native-wall controls passed
Which V12 controls missed, and how did V13 follow up?
  • Count by product + join · 1M · adjusted native-wall interval [-9.18%, +8.78%]
  • Inferred join keys · 1M · adjusted native-wall interval [-7.09%, +10.93%]
  • Count + join default control · 1M · adjusted native-wall interval [-12.88%, +10.11%]

V11 source and rebuilt binaries were restored exactly after V12. The V12 candidate and its evidence remain archived. V13 followed a fresh frozen plan, retained the worker fix, removed the remaining leader shutdown wait and passed every control. Both studies keep their original results.

The original user-paused trial keeps its 655 completed calls and 1 interrupted invocation separately. Only the fresh 2,400-call trial determines this result.

These are internal C++ comparisons. Three requested loopback workers, four threads each, on one shared Mac. No Photon or new cross-language comparison was run.

Read the complete decision and method →

Historical engine ledgers · 2026-10-08 to 2026-10-12

Every run, every kernel.

These earlier language and library measurements keep their original dates and values. neo is white; the closest engine at the last run is dashed. A hollow point was taken on a busy machine.

How these were taken

Every run the ledgers kept of neo against the others, oldest first: nothing on this tab was measured again for it. A flag is a move of neo's time from one run to the next beyond what a re-run moves by itself (5% at a millisecond and over, 10% under it): green and down is quicker, amber and up is slower, with the day it was recorded. Within the band it is noise and is not flagged. A hollow point was recorded on a busy machine.

Against the field, 1,000,000 rows

load the CSV

10.4 → 2.77 ms

3.8× quicker over 11 runs, 10-08 to 10-11 · Polars 15.2 ms at the last

neo 2.77Polars 15.210-0810-112026-10-08 19:52 · busy machine · neo 10.4 ms · Polars 17.2 ms · c138ccb2026-10-08 20:08 · busy machine · neo 8.78 ms · Polars 15.6 ms · ab951ac2026-10-10 11:52 · busy machine · neo 8.31 ms · Polars 15.6 ms · afeb06c2026-10-10 12:00 · neo 8.89 ms · Polars 15.5 ms · afeb06c2026-10-11 10:29 · neo 4.31 ms · Polars 16.6 ms · f1d835a2026-10-11 16:03 · neo 2.95 ms · Polars 16.9 ms · f1d835a2026-10-11 17:08 · neo 2.89 ms · Polars 15.6 ms · f1d835a2026-10-11 17:31 · neo 2.92 ms · Polars 15.3 ms · f1d835a2026-10-11 21:01 · neo 2.83 ms · Polars 15.1 ms · f1d835a2026-10-11 21:13 · neo 2.93 ms · Polars 14.8 ms · f1d835a2026-10-11 21:23 · neo 2.77 ms · Polars 15.2 ms · f1d835a

filter, count

0.021 → 0.018 ms

1.2× quicker over 11 runs, 10-08 to 10-11 · Polars 0.179 ms at the last

neo 0.018Polars 0.17910-0810-112026-10-08 19:52 · busy machine · neo 0.021 ms · Polars 0.198 ms · c138ccb2026-10-08 20:08 · busy machine · neo 0.014 ms · Polars 0.208 ms · ab951ac2026-10-10 11:52 · busy machine · neo 0.014 ms · Polars 0.219 ms · afeb06c2026-10-10 12:00 · neo 0.014 ms · Polars 0.191 ms · afeb06c2026-10-11 10:29 · neo 0.014 ms · Polars 0.201 ms · f1d835a2026-10-11 16:03 · neo 0.014 ms · Polars 0.177 ms · f1d835a2026-10-11 17:08 · neo 0.014 ms · Polars 0.171 ms · f1d835a2026-10-11 17:31 · neo 0.014 ms · Polars 0.178 ms · f1d835a2026-10-11 21:01 · neo 0.017 ms · Polars 0.187 ms · f1d835a2026-10-11 21:13 · neo 0.017 ms · Polars 0.178 ms · f1d835a2026-10-11 21:23 · neo 0.018 ms · Polars 0.179 ms · f1d835a

filter into a new table

1.40 → 0.380 ms

3.7× quicker over 11 runs, 10-08 to 10-11 · Polars 0.889 ms at the last

neo 0.380Polars 0.88910-0810-112026-10-08 19:52 · busy machine · neo 1.40 ms · Polars 1.08 ms · c138ccb2026-10-08 20:08 · busy machine · neo 0.415 ms · Polars 1.06 ms · ab951ac2026-10-10 11:52 · busy machine · neo 0.319 ms · Polars 0.938 ms · afeb06c2026-10-10 12:00 · neo 0.295 ms · Polars 1.09 ms · afeb06c2026-10-11 10:29 · neo 0.490 ms · Polars 1.14 ms · f1d835a2026-10-11 16:03 · neo 0.383 ms · Polars 1.06 ms · f1d835a2026-10-11 17:08 · neo 0.333 ms · Polars 1.09 ms · f1d835a2026-10-11 17:31 · neo 0.316 ms · Polars 1.06 ms · f1d835a2026-10-11 21:01 · neo 0.364 ms · Polars 0.908 ms · f1d835a2026-10-11 21:13 · neo 0.319 ms · Polars 0.999 ms · f1d835a2026-10-11 21:23 · neo 0.380 ms · Polars 0.889 ms · f1d835a

sort, as a permutation

1.05 → 1.03 ms

level over 11 runs, 10-08 to 10-11 · Polars 6.68 ms at the last

neo 1.03Polars 6.6810-0810-112026-10-08 19:52 · busy machine · neo 1.05 ms · Polars 7.34 ms · c138ccb2026-10-08 20:08 · busy machine · neo 1.07 ms · Polars 7.27 ms · ab951ac2026-10-10 11:52 · busy machine · neo 1.05 ms · Polars 6.35 ms · afeb06c2026-10-10 12:00 · neo 1.06 ms · Polars 6.62 ms · afeb06c2026-10-11 10:29 · neo 1.06 ms · Polars 7.23 ms · f1d835a2026-10-11 16:03 · neo 1.03 ms · Polars 7.11 ms · f1d835a2026-10-11 17:08 · neo 1.02 ms · Polars 6.80 ms · f1d835a2026-10-11 17:31 · neo 1.03 ms · Polars 7.18 ms · f1d835a2026-10-11 21:01 · neo 1.04 ms · Polars 6.58 ms · f1d835a2026-10-11 21:13 · neo 1.06 ms · Polars 6.83 ms · f1d835a2026-10-11 21:23 · neo 1.03 ms · Polars 6.68 ms · f1d835a

sort into a new table

3.07 → 2.72 ms

1.1× quicker over 11 runs, 10-08 to 10-11 · Polars 12.2 ms at the last

neo 2.72Polars 12.210-0810-112026-10-08 19:52 · busy machine · neo 3.07 ms · Polars 13.7 ms · c138ccb2026-10-08 20:08 · busy machine · neo 2.98 ms · Polars 12.4 ms · ab951ac2026-10-10 11:52 · busy machine · neo 2.77 ms · Polars 10.7 ms · afeb06c2026-10-10 12:00 · neo 2.72 ms · Polars 11.8 ms · afeb06c2026-10-11 10:29 · neo 2.91 ms · Polars 13.7 ms · f1d835a2026-10-11 16:03 · neo 2.75 ms · Polars 12.5 ms · f1d835a2026-10-11 17:08 · neo 2.74 ms · Polars 11.7 ms · f1d835a2026-10-11 17:31 · neo 2.75 ms · Polars 12.1 ms · f1d835a2026-10-11 21:01 · neo 2.69 ms · Polars 11.8 ms · f1d835a2026-10-11 21:13 · neo 2.76 ms · Polars 12.2 ms · f1d835a2026-10-11 21:23 · neo 2.72 ms · Polars 12.2 ms · f1d835a

sum by region

0.051 → 0.020 ms

2.5× quicker over 11 runs, 10-08 to 10-11 · Polars 1.55 ms at the last

neo 0.020Polars 1.5510-0810-112026-10-08 19:52 · busy machine · neo 0.051 ms · Polars 2.04 ms · c138ccb2026-10-08 20:08 · busy machine · neo 0.035 ms · Polars 1.55 ms · ab951ac2026-10-10 11:52 · busy machine · neo 0.032 ms · Polars 1.49 ms · afeb06c2026-10-10 12:00 · neo 0.032 ms · Polars 1.61 ms · afeb06c2026-10-11 10:29 · neo 0.035 ms · Polars 1.61 ms · f1d835a2026-10-11 16:03 · neo 0.024 ms · Polars 1.60 ms · f1d835a2026-10-11 17:08 · neo 0.019 ms · Polars 1.41 ms · f1d835a2026-10-11 17:31 · neo 0.019 ms · Polars 1.57 ms · f1d835a2026-10-11 21:01 · neo 0.020 ms · Polars 1.70 ms · f1d835a2026-10-11 21:13 · neo 0.020 ms · Polars 1.52 ms · f1d835a2026-10-11 21:23 · neo 0.020 ms · Polars 1.55 ms · f1d835a
Every run as a table

load the CSV · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:52 · busy10.417.265.1256412
2026-10-08 20:08 · busy8.7815.657.3241426
2026-10-10 11:52 · busy8.3115.649.2227389
2026-10-10 12:008.8915.550.0240343
2026-10-11 10:294.3116.654.2255412
2026-10-11 16:032.9516.949.0241383
2026-10-11 17:082.8915.651.3234378
2026-10-11 17:312.9215.351.0237375
2026-10-11 21:012.8315.153.3227356
2026-10-11 21:132.9314.851.6234354
2026-10-11 21:232.7715.251.8229359

filter, count · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:52 · busy0.0210.1980.6260.33743.7
2026-10-08 20:08 · busy0.0140.2080.6220.33340.9
2026-10-10 11:52 · busy0.0140.2190.5680.32735.3
2026-10-10 12:000.0140.1910.5720.33341.4
2026-10-11 10:290.0140.2010.6440.33143.1
2026-10-11 16:030.0140.1770.5660.31539.1
2026-10-11 17:080.0140.1710.5530.32835.0
2026-10-11 17:310.0140.1780.5820.34539.1
2026-10-11 21:010.0170.1870.5340.32837.6
2026-10-11 21:130.0170.1780.5540.32434.5
2026-10-11 21:230.0180.1790.6020.32836.9

filter into a new table · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:52 · busy1.401.0843.812.724.3
2026-10-08 20:08 · busy0.4151.0641.612.524.9
2026-10-10 11:52 · busy0.3190.93840.112.022.1
2026-10-10 12:000.2951.0940.211.924.1
2026-10-11 10:290.4901.1443.312.924.5
2026-10-11 16:030.3831.0640.211.925.6
2026-10-11 17:080.3331.0940.411.923.3
2026-10-11 17:310.3161.0642.212.122.5
2026-10-11 21:010.3640.90840.211.724.2
2026-10-11 21:130.3190.99939.811.720.7
2026-10-11 21:230.3800.88940.311.822.0

sort, as a permutation · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:52 · busy1.057.34—71.7—
2026-10-08 20:08 · busy1.077.27—69.8—
2026-10-10 11:52 · busy1.056.35—65.2—
2026-10-10 12:001.066.62—65.2—
2026-10-11 10:291.067.23—71.3—
2026-10-11 16:031.037.11—65.6—
2026-10-11 17:081.026.80—66.6—
2026-10-11 17:311.037.18—66.4—
2026-10-11 21:011.046.58—64.1—
2026-10-11 21:131.066.83—64.7—
2026-10-11 21:231.036.68—64.8—

sort into a new table · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:52 · busy3.0713.727.6142135
2026-10-08 20:08 · busy2.9812.425.0126124
2026-10-10 11:52 · busy2.7710.723.2113123
2026-10-10 12:002.7211.824.8115119
2026-10-11 10:292.9113.727.6129134
2026-10-11 16:032.7512.524.2119117
2026-10-11 17:082.7411.724.8112112
2026-10-11 17:312.7512.125.5114116
2026-10-11 21:012.6911.823.2111116
2026-10-11 21:132.7612.223.9109121
2026-10-11 21:232.7212.223.4110122

sum by region · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:52 · busy0.0512.042.7513.253.6
2026-10-08 20:08 · busy0.0351.552.5212.646.5
2026-10-10 11:52 · busy0.0321.492.2812.445.0
2026-10-10 12:000.0321.612.3112.442.1
2026-10-11 10:290.0351.612.4013.545.2
2026-10-11 16:030.0241.602.2812.343.0
2026-10-11 17:080.0191.412.2912.840.2
2026-10-11 17:310.0191.572.3012.442.1
2026-10-11 21:010.0201.702.3012.240.4
2026-10-11 21:130.0201.522.2712.040.9
2026-10-11 21:230.0201.552.2412.239.0

Against the field, 10,000,000 rows

load the CSV

78.8 → 21.7 ms

3.6× quicker over 11 runs, 10-08 to 10-11 · Polars 114 ms at the last

neo 21.7Polars 11410-0810-112026-10-08 19:53 · busy machine · neo 78.8 ms · Polars 348 ms · c138ccb2026-10-08 20:09 · busy machine · neo 90.7 ms · Polars 130 ms · ab951ac2026-10-10 11:52 · busy machine · neo 85.8 ms · Polars 120 ms · afeb06c2026-10-10 12:01 · neo 81.8 ms · Polars 119 ms · afeb06c2026-10-11 10:30 · neo 34.8 ms · Polars 129 ms · f1d835a2026-10-11 16:04 · neo 23.6 ms · Polars 128 ms · f1d835a2026-10-11 17:09 · neo 23.9 ms · Polars 132 ms · f1d835a2026-10-11 17:31 · neo 24.1 ms · Polars 130 ms · f1d835a2026-10-11 21:02 · neo 21.9 ms · Polars 117 ms · f1d835a2026-10-11 21:14 · neo 22.3 ms · Polars 114 ms · f1d835a2026-10-11 21:24 · neo 21.7 ms · Polars 114 ms · f1d835a

filter, count

0.341 → 0.317 ms

1.1× quicker over 11 runs, 10-08 to 10-11 · Polars 0.621 ms at the last

neo 0.317Polars 0.62110-0810-112026-10-08 19:53 · busy machine · neo 0.341 ms · Polars 1.29 ms · c138ccb2026-10-08 20:09 · busy machine · neo 0.324 ms · Polars 0.678 ms · ab951ac2026-10-10 11:52 · busy machine · neo 0.305 ms · Polars 0.616 ms · afeb06c2026-10-10 12:01 · neo 0.315 ms · Polars 0.631 ms · afeb06c2026-10-11 10:30 · neo 0.322 ms · Polars 0.621 ms · f1d835a2026-10-11 16:04 · neo 0.317 ms · Polars 0.617 ms · f1d835a2026-10-11 17:09 · neo 0.322 ms · Polars 0.626 ms · f1d835a2026-10-11 17:31 · neo 0.315 ms · Polars 0.619 ms · f1d835a2026-10-11 21:02 · neo 0.313 ms · Polars 0.596 ms · f1d835a2026-10-11 21:14 · neo 0.312 ms · Polars 0.636 ms · f1d835a2026-10-11 21:24 · neo 0.317 ms · Polars 0.621 ms · f1d835a

filter into a new table

4.04 → 3.40 ms

1.2× quicker over 11 runs, 10-08 to 10-11 · Polars 9.13 ms at the last

neo 3.40Polars 9.1310-0810-112026-10-08 19:53 · busy machine · neo 4.04 ms · Polars 17.4 ms · c138ccb2026-10-08 20:09 · busy machine · neo 3.39 ms · Polars 8.57 ms · ab951ac2026-10-10 11:52 · busy machine · neo 3.42 ms · Polars 8.91 ms · afeb06c2026-10-10 12:01 · neo 3.43 ms · Polars 7.63 ms · afeb06c2026-10-11 10:30 · neo 3.55 ms · Polars 7.66 ms · f1d835a2026-10-11 16:04 · neo 3.50 ms · Polars 7.92 ms · f1d835a2026-10-11 17:09 · neo 3.43 ms · Polars 8.73 ms · f1d835a2026-10-11 17:31 · neo 3.42 ms · Polars 6.85 ms · f1d835a2026-10-11 21:02 · neo 3.66 ms · Polars 7.39 ms · f1d835a2026-10-11 21:14 · neo 3.45 ms · Polars 7.21 ms · f1d835a2026-10-11 21:24 · neo 3.40 ms · Polars 9.13 ms · f1d835a

sort, as a permutation

12.9 → 9.39 ms

1.4× quicker over 11 runs, 10-08 to 10-11 · Polars 71.4 ms at the last

neo 9.39Polars 71.410-0810-112026-10-08 19:53 · busy machine · neo 12.9 ms · Polars 153 ms · c138ccb2026-10-08 20:09 · busy machine · neo 9.69 ms · Polars 99.4 ms · ab951ac2026-10-10 11:52 · busy machine · neo 9.19 ms · Polars 69.1 ms · afeb06c2026-10-10 12:01 · neo 9.39 ms · Polars 70.3 ms · afeb06c2026-10-11 10:30 · neo 9.88 ms · Polars 75.6 ms · f1d835a2026-10-11 16:04 · neo 9.66 ms · Polars 73.2 ms · f1d835a2026-10-11 17:09 · neo 9.35 ms · Polars 69.7 ms · f1d835a2026-10-11 17:31 · neo 9.43 ms · Polars 69.8 ms · f1d835a2026-10-11 21:02 · neo 9.19 ms · Polars 72.7 ms · f1d835a2026-10-11 21:14 · neo 9.31 ms · Polars 71.6 ms · f1d835a2026-10-11 21:24 · neo 9.39 ms · Polars 71.4 ms · f1d835a

sort into a new table

68.3 → 62.6 ms

1.1× quicker over 11 runs, 10-08 to 10-11 · Polars 139 ms at the last

neo 62.6Polars 13910-0810-112026-10-08 19:53 · busy machine · neo 68.3 ms · Polars 812 ms · c138ccb2026-10-08 20:09 · busy machine · neo 64.0 ms · Polars 174 ms · ab951ac2026-10-10 11:52 · busy machine · neo 63.0 ms · Polars 132 ms · afeb06c2026-10-10 12:01 · neo 63.1 ms · Polars 122 ms · afeb06c2026-10-11 10:30 · neo 65.6 ms · Polars 137 ms · f1d835a2026-10-11 16:04 · neo 64.2 ms · Polars 132 ms · f1d835a2026-10-11 17:09 · neo 63.4 ms · Polars 125 ms · f1d835a2026-10-11 17:31 · neo 63.2 ms · Polars 125 ms · f1d835a2026-10-11 21:02 · neo 62.4 ms · Polars 137 ms · f1d835a2026-10-11 21:14 · neo 62.3 ms · Polars 145 ms · f1d835a2026-10-11 21:24 · neo 62.6 ms · Polars 139 ms · f1d835a

sum by region

0.490 → 0.401 ms

1.2× quicker over 11 runs, 10-08 to 10-11 · Polars 6.03 ms at the last

neo 0.401Polars 6.0310-0810-112026-10-08 19:53 · busy machine · neo 0.490 ms · Polars 106 ms · c138ccb2026-10-08 20:09 · busy machine · neo 0.481 ms · Polars 10.7 ms · ab951ac2026-10-10 11:52 · busy machine · neo 0.474 ms · Polars 6.69 ms · afeb06c2026-10-10 12:01 · neo 0.482 ms · Polars 6.83 ms · afeb06c2026-10-11 10:30 · neo 0.501 ms · Polars 6.34 ms · f1d835a2026-10-11 16:04 · neo 0.476 ms · Polars 6.04 ms · f1d835a2026-10-11 17:09 · neo 0.468 ms · Polars 6.26 ms · f1d835a2026-10-11 17:31 · neo 0.475 ms · Polars 6.02 ms · f1d835a2026-10-11 21:02 · neo 0.465 ms · Polars 5.95 ms · f1d835a2026-10-11 21:14 · neo 0.466 ms · Polars 5.60 ms · f1d835a2026-10-11 21:24 · neo 0.401 ms · Polars 6.03 ms · f1d835a
Every run as a table

load the CSV · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:53 · busy78.83481,4902,6752,651
2026-10-08 20:09 · busy90.71303922,5222,970
2026-10-10 11:52 · busy85.81201952,3651,327
2026-10-10 12:0181.81192042,4201,504
2026-10-11 10:3034.81292152,5661,420
2026-10-11 16:0423.61282092,3761,515
2026-10-11 17:0923.91322202,4221,387
2026-10-11 17:3124.11301992,4651,541
2026-10-11 21:0221.91172002,4281,372
2026-10-11 21:1422.31142142,3351,472
2026-10-11 21:2421.71142132,3431,450

filter, count · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:53 · busy0.3411.293.833.8979.5
2026-10-08 20:09 · busy0.3240.6784.123.7268.8
2026-10-10 11:52 · busy0.3050.6162.193.0842.5
2026-10-10 12:010.3150.6312.203.0842.3
2026-10-11 10:300.3220.6212.323.1847.1
2026-10-11 16:040.3170.6172.193.1046.6
2026-10-11 17:090.3220.6262.213.0840.6
2026-10-11 17:310.3150.6192.203.1545.1
2026-10-11 21:020.3130.5962.093.0642.5
2026-10-11 21:140.3120.6362.193.0641.4
2026-10-11 21:240.3170.6212.133.1239.3

filter into a new table · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:53 · busy4.0417.4948155114
2026-10-08 20:09 · busy3.398.57485154102
2026-10-10 11:52 · busy3.428.9124614069.1
2026-10-10 12:013.437.6326413665.8
2026-10-11 10:303.557.6629915278.9
2026-10-11 16:043.507.9229314069.2
2026-10-11 17:093.438.7327413975.9
2026-10-11 17:313.426.8527614164.4
2026-10-11 21:023.667.3921614261.6
2026-10-11 21:143.457.2123414163.0
2026-10-11 21:243.409.1332813965.1

sort, as a permutation · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:53 · busy12.9153—945—
2026-10-08 20:09 · busy9.6999.4—870—
2026-10-10 11:52 · busy9.1969.1—809—
2026-10-10 12:019.3970.3—804—
2026-10-11 10:309.8875.6—873—
2026-10-11 16:049.6673.2—808—
2026-10-11 17:099.3569.7—813—
2026-10-11 17:319.4369.8—837—
2026-10-11 21:029.1972.7—794—
2026-10-11 21:149.3171.6—787—
2026-10-11 21:249.3971.4—798—

sort into a new table · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:53 · busy68.38121,0152,809765
2026-10-08 20:09 · busy64.01742082,028896
2026-10-10 11:52 · busy63.01321711,928469
2026-10-10 12:0163.11221901,961475
2026-10-11 10:3065.61372172,176522
2026-10-11 16:0464.21321882,056451
2026-10-11 17:0963.41251761,960504
2026-10-11 17:3163.21251882,040484
2026-10-11 21:0262.41371891,912459
2026-10-11 21:1462.31451791,900467
2026-10-11 21:2462.61391881,913469

sum by region · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 19:53 · busy0.49010630.4179128
2026-10-08 20:09 · busy0.48110.713.7157112
2026-10-10 11:52 · busy0.4746.699.1813769.7
2026-10-10 12:010.4826.839.2414070.1
2026-10-11 10:300.5016.349.4315282.1
2026-10-11 16:040.4766.048.9513964.7
2026-10-11 17:090.4686.269.0413972.7
2026-10-11 17:310.4756.029.1714076.2
2026-10-11 21:020.4655.959.1114163.6
2026-10-11 21:140.4665.608.9413862.3
2026-10-11 21:240.4016.038.9614266.1

Against the field, 100,000,000 rows

load the CSV

1,465 → 249 ms

5.9× quicker over 10 runs, 10-08 to 10-11 · Polars 1,186 ms at the last

neo 249Polars 1,18610-0810-112026-10-08 20:16 · busy machine · neo 1,465 ms · Polars 1,715 ms · ab951ac2026-10-10 11:58 · busy machine · neo 909 ms · Polars 1,203 ms · afeb06c2026-10-10 12:08 · neo 861 ms · Polars 1,227 ms · afeb06c2026-10-11 10:38 · neo 409 ms · Polars 1,340 ms · f1d835a2026-10-11 16:09 · neo 299 ms · Polars 1,210 ms · f1d835a2026-10-11 17:15 · neo 285 ms · Polars 1,203 ms · f1d835a2026-10-11 17:38 · neo 279 ms · Polars 1,206 ms · f1d835a2026-10-11 21:07 · neo 244 ms · Polars 1,165 ms · f1d835a2026-10-11 21:20 · neo 244 ms · Polars 1,132 ms · f1d835a2026-10-11 21:29 · neo 249 ms · Polars 1,186 ms · f1d835a

filter, count

3.52 → 2.98 ms

1.2× quicker over 10 runs, 10-08 to 10-11 · Polars 4.45 ms at the last

neo 2.98Polars 4.4510-0810-112026-10-08 20:16 · busy machine · neo 3.52 ms · Polars 4.67 ms · ab951ac2026-10-10 11:58 · busy machine · neo 3.01 ms · Polars 3.95 ms · afeb06c2026-10-10 12:08 · neo 2.89 ms · Polars 4.31 ms · afeb06c2026-10-11 10:38 · neo 3.09 ms · Polars 4.48 ms · f1d835a2026-10-11 16:09 · neo 3.13 ms · Polars 4.43 ms · f1d835a2026-10-11 17:15 · neo 2.91 ms · Polars 4.15 ms · f1d835a2026-10-11 17:38 · neo 2.91 ms · Polars 4.27 ms · f1d835a2026-10-11 21:07 · neo 2.92 ms · Polars 4.12 ms · f1d835a2026-10-11 21:20 · neo 3.00 ms · Polars 4.34 ms · f1d835a2026-10-11 21:29 · neo 2.98 ms · Polars 4.45 ms · f1d835a

filter into a new table

48.1 → 34.3 ms

1.4× quicker over 10 runs, 10-08 to 10-11 · Polars 111 ms at the last

neo 34.3Polars 11110-0810-112026-10-08 20:16 · busy machine · neo 48.1 ms · Polars 151 ms · ab951ac2026-10-10 11:58 · busy machine · neo 35.4 ms · Polars 136 ms · afeb06c2026-10-10 12:08 · neo 34.3 ms · Polars 125 ms · afeb06c2026-10-11 10:38 · neo 36.5 ms · Polars 137 ms · f1d835a2026-10-11 16:09 · neo 35.6 ms · Polars 100.0 ms · f1d835a2026-10-11 17:15 · neo 34.7 ms · Polars 125 ms · f1d835a2026-10-11 17:38 · neo 34.4 ms · Polars 116 ms · f1d835a2026-10-11 21:07 · neo 34.2 ms · Polars 119 ms · f1d835a2026-10-11 21:20 · neo 33.9 ms · Polars 113 ms · f1d835a2026-10-11 21:29 · neo 34.3 ms · Polars 111 ms · f1d835a

sort, as a permutation

150 → 99.6 ms

1.5× quicker over 10 runs, 10-08 to 10-11 · Polars 1,031 ms at the last

neo 99.6Polars 1,03110-0810-112026-10-08 20:16 · busy machine · neo 150 ms · Polars 1,560 ms · ab951ac2026-10-10 11:58 · busy machine · neo 98.9 ms · Polars 1,000 ms · afeb06c2026-10-10 12:08 · neo 100 ms · Polars 1,107 ms · afeb06c2026-10-11 10:38 · neo 104 ms · Polars 1,144 ms · f1d835a2026-10-11 16:09 · neo 102 ms · Polars 1,055 ms · f1d835a2026-10-11 17:15 · neo 101 ms · Polars 1,055 ms · f1d835a2026-10-11 17:38 · neo 99.9 ms · Polars 1,083 ms · f1d835a2026-10-11 21:07 · neo 99.1 ms · Polars 983 ms · f1d835a2026-10-11 21:20 · neo 99.4 ms · Polars 970 ms · f1d835a2026-10-11 21:29 · neo 99.6 ms · Polars 1,031 ms · f1d835a

sort into a new table

1,483 → 744 ms

2.0× quicker over 10 runs, 10-08 to 10-11 · Polars 1,542 ms at the last

neo 744Polars 1,54210-0810-112026-10-08 20:16 · busy machine · neo 1,483 ms · Polars 2,490 ms · ab951ac2026-10-10 11:58 · busy machine · neo 752 ms · Polars 1,716 ms · afeb06c2026-10-10 12:08 · neo 750 ms · Polars 1,677 ms · afeb06c2026-10-11 10:38 · neo 771 ms · Polars 1,833 ms · f1d835a2026-10-11 16:09 · neo 759 ms · Polars 1,693 ms · f1d835a2026-10-11 17:15 · neo 750 ms · Polars 1,658 ms · f1d835a2026-10-11 17:38 · neo 747 ms · Polars 1,614 ms · f1d835a2026-10-11 21:07 · neo 745 ms · Polars 1,547 ms · f1d835a2026-10-11 21:20 · neo 744 ms · Polars 1,522 ms · f1d835a2026-10-11 21:29 · neo 744 ms · Polars 1,542 ms · f1d835a

sum by region

5.41 → 4.11 ms

1.3× quicker over 10 runs, 10-08 to 10-11 · Polars 52.8 ms at the last

neo 4.11Polars 52.810-0810-112026-10-08 20:16 · busy machine · neo 5.41 ms · Polars 85.8 ms · ab951ac2026-10-10 11:58 · busy machine · neo 5.06 ms · Polars 55.7 ms · afeb06c2026-10-10 12:08 · neo 5.08 ms · Polars 53.7 ms · afeb06c2026-10-11 10:38 · neo 4.94 ms · Polars 56.8 ms · f1d835a2026-10-11 16:09 · neo 4.24 ms · Polars 51.3 ms · f1d835a2026-10-11 17:15 · neo 4.21 ms · Polars 53.4 ms · f1d835a2026-10-11 17:38 · neo 4.07 ms · Polars 52.5 ms · f1d835a2026-10-11 21:07 · neo 4.08 ms · Polars 52.1 ms · f1d835a2026-10-11 21:20 · neo 4.10 ms · Polars 52.7 ms · f1d835a2026-10-11 21:29 · neo 4.11 ms · Polars 52.8 ms · f1d835a
Every run as a table

load the CSV · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 20:16 · busy1,4651,7153,97633,84429,040
2026-10-10 11:58 · busy9091,2032,31526,50116,694
2026-10-10 12:088611,2272,45227,35713,784
2026-10-11 10:384091,3402,63828,52714,573
2026-10-11 16:092991,2102,28828,08114,524
2026-10-11 17:152851,2032,37526,60014,249
2026-10-11 17:382791,2062,35626,81716,094
2026-10-11 21:072441,1652,37426,86815,837
2026-10-11 21:202441,1322,38626,44415,666
2026-10-11 21:292491,1862,38827,00915,900

filter, count · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 20:16 · busy3.524.6721.739.1167
2026-10-10 11:58 · busy3.013.9518.730.6137
2026-10-10 12:082.894.3119.130.6134
2026-10-11 10:383.094.4819.731.4136
2026-10-11 16:093.134.4318.930.4124
2026-10-11 17:152.914.1518.930.6132
2026-10-11 17:382.914.2718.430.4132
2026-10-11 21:072.924.1218.230.4129
2026-10-11 21:203.004.3418.130.4130
2026-10-11 21:292.984.4518.430.4131

filter into a new table · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 20:16 · busy48.11512,4381,5781,361
2026-10-10 11:58 · busy35.41361,6801,504691
2026-10-10 12:0834.31251,6771,475716
2026-10-11 10:3836.51372,1921,615719
2026-10-11 16:0935.6100.01,5331,531626
2026-10-11 17:1534.71251,8311,549711
2026-10-11 17:3834.41161,6241,431708
2026-10-11 21:0734.21191,6701,459696
2026-10-11 21:2033.91131,7211,474687
2026-10-11 21:2934.31111,7531,541693

sort, as a permutation · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 20:16 · busy1501,560—10,093—
2026-10-10 11:58 · busy98.91,000—9,706—
2026-10-10 12:081001,107—10,051—
2026-10-11 10:381041,144—10,835—
2026-10-11 16:091021,055—9,821—
2026-10-11 17:151011,055—9,929—
2026-10-11 17:3899.91,083—9,866—
2026-10-11 21:0799.1983—9,615—
2026-10-11 21:2099.4970—9,735—
2026-10-11 21:2999.61,031—9,765—

sort into a new table · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 20:16 · busy1,4832,4904,45324,6798,585
2026-10-10 11:58 · busy7521,7163,05923,3945,289
2026-10-10 12:087501,6772,88923,5625,211
2026-10-11 10:387711,8333,59525,4185,392
2026-10-11 16:097591,6932,92923,4514,653
2026-10-11 17:157501,6582,93023,5545,383
2026-10-11 17:387471,6142,64723,1795,173
2026-10-11 21:077451,5472,70222,7064,830
2026-10-11 21:207441,5222,92923,0924,834
2026-10-11 21:297441,5422,87523,2774,970

sum by region · ms

runneoPolarsDuckDBpandasSpark
2026-10-08 20:16 · busy5.4185.899.81,452803
2026-10-10 11:58 · busy5.0655.781.31,401477
2026-10-10 12:085.0853.782.81,415454
2026-10-11 10:384.9456.885.41,530473
2026-10-11 16:094.2451.380.71,419401
2026-10-11 17:154.2153.482.31,444466
2026-10-11 17:384.0752.583.51,403453
2026-10-11 21:074.0852.181.11,396414
2026-10-11 21:204.1052.782.11,399415
2026-10-11 21:294.1152.884.41,398432

Against the ports: Go, Rust, Swift, Zig

The four ports were timed together on one day (2026-10-12); only the cold load was run twice, so it is the one kernel of theirs with a line. Measured once and so not drawn: load, filter, count, sort, as a permutation, sort into a new table, sum by region — the Evals tab has those. The load in process is neo's against the Rust port's, the one port bench_load_profile.sh runs, which it has done since 2026-10-10.

load, the parse loop in process, 1M rows

5.82 → 2.79 ms

2.1× quicker over 6 runs, 10-10 to 10-11 · Rust 3.11 ms at the last

neo 2.79Rust 3.1110-1010-112026-10-10 16:21 · busy machine · neo 5.82 ms · Rust 3.06 ms · e3df52c2026-10-10 17:35 · neo 5.09 ms · Rust 2.98 ms · 6acac782026-10-10 18:11 · busy machine · neo 5.45 ms · Rust 2.95 ms · 6acac782026-10-10 21:53 · neo 4.87 ms · Rust 3.22 ms · 3f8b3b42026-10-11 08:14 · busy machine · neo 3.58 ms · Rust 3.09 ms · dba1fdf2026-10-11 14:11 · neo 2.79 ms · Rust 3.11 ms · f1d835a

cold load, a fresh process, 1M rows

8.96 → 5.96 ms

1.5× quicker over 2 runs, 10-12 to 10-12 · Zig 4.32 ms at the last

neo 5.96Zig 4.3210-1210-122026-10-12 06:38 · neo 8.96 ms · Zig 4.45 ms · 369589d2026-10-12 07:17 · neo 5.96 ms · Zig 4.32 ms · 369589d

load, the parse loop in process, 10M rows

44.5 → 21.1 ms

2.1× quicker over 6 runs, 10-10 to 10-11 · Rust 32.6 ms at the last

neo 21.1Rust 32.610-1010-112026-10-10 16:21 · busy machine · neo 44.5 ms · Rust 34.4 ms · e3df52c2026-10-10 17:35 · busy machine · neo 41.6 ms · Rust 38.0 ms · 6acac782026-10-10 18:11 · busy machine · neo 44.1 ms · Rust 35.6 ms · 6acac782026-10-10 21:53 · neo 36.6 ms · Rust 36.3 ms · 3f8b3b42026-10-11 08:14 · busy machine · neo 28.9 ms · Rust 34.5 ms · dba1fdf2026-10-11 14:11 · busy machine · neo 21.1 ms · Rust 32.6 ms · f1d835a

cold load, a fresh process, 10M rows

45.0 → 43.3 ms

level over 2 runs, 10-12 to 10-12 · Zig 38.8 ms at the last

neo 43.3Zig 38.810-1210-122026-10-12 06:44 · neo 45.0 ms · Zig 39.8 ms · 369589d2026-10-12 07:18 · neo 43.3 ms · Zig 38.8 ms · 369589d

load, the parse loop in process, 100M rows

632 → 500 ms

1.3× quicker over 2 runs, 10-10 to 10-10 · Rust 298 ms at the last

neo 500Rust 29810-1010-102026-10-10 16:21 · busy machine · neo 632 ms · Rust 367 ms · e3df52c2026-10-10 21:54 · busy machine · neo 500 ms · Rust 298 ms · 3f8b3b4

cold load, a fresh process, 100M rows

420 → 426 ms

level over 2 runs, 10-12 to 10-12 · Zig 454 ms at the last

neo 426Zig 45410-1210-122026-10-12 07:12 · neo 420 ms · Zig 448 ms · 369589d2026-10-12 07:19 · neo 426 ms · Zig 454 ms · 369589d
Every run as a table

load, the parse loop in process, 1M rows · ms

runneoGoRustSwiftZig
2026-10-10 16:21 · busy5.82—3.06——
2026-10-10 17:355.09—2.98——
2026-10-10 18:11 · busy5.45—2.95——
2026-10-10 21:534.87—3.22——
2026-10-11 08:14 · busy3.58—3.09——
2026-10-11 14:112.79—3.11——

cold load, a fresh process, 1M rows · ms

runneoGoRustSwiftZig
2026-10-12 06:388.9610.47.296.694.45
2026-10-12 07:175.969.976.266.544.32

load, the parse loop in process, 10M rows · ms

runneoGoRustSwiftZig
2026-10-10 16:21 · busy44.5—34.4——
2026-10-10 17:35 · busy41.6—38.0——
2026-10-10 18:11 · busy44.1—35.6——
2026-10-10 21:5336.6—36.3——
2026-10-11 08:14 · busy28.9—34.5——
2026-10-11 14:11 · busy21.1—32.6——

cold load, a fresh process, 10M rows · ms

runneoGoRustSwiftZig
2026-10-12 06:4445.079.958.359.739.8
2026-10-12 07:1843.377.356.555.438.8

load, the parse loop in process, 100M rows · ms

runneoGoRustSwiftZig
2026-10-10 16:21 · busy632—367——
2026-10-10 21:54 · busy500—298——

cold load, a fresh process, 100M rows · ms

runneoGoRustSwiftZig
2026-10-12 07:12420726504482448
2026-10-12 07:19426734542496454

On public data, read as text

worldcitiespop, first load

29.2 → 23.8 ms

1.2× quicker over 4 runs, 10-11 to 10-11 · Arrow 26.3 ms at the last

neo 23.8Arrow 26.310-1110-112026-10-11 09:02 · neo 29.2 ms · Arrow 29.8 ms · f1d835a2026-10-11 09:09 · busy machine · neo 29.8 ms · Arrow 29.8 ms · f1d835a2026-10-11 09:46 · neo 25.6 ms · Arrow 29.6 ms · f1d835a2026-10-11 16:12 · neo 23.8 ms · Arrow 26.3 ms · f1d835a

worldcitiespop, loads after it

19.3 → 11.4 ms

1.7× quicker over 4 runs, 10-11 to 10-11 · Arrow 23.0 ms at the last

neo 11.4Arrow 23.010-1110-112026-10-11 09:02 · neo 19.3 ms · Arrow 26.6 ms · f1d835a2026-10-11 09:09 · busy machine · neo 19.5 ms · Arrow 26.5 ms · f1d835a2026-10-11 09:46 · neo 12.6 ms · Arrow 26.8 ms · f1d835a2026-10-11 16:12 · neo 11.4 ms · Arrow 23.0 ms · f1d835a

NYC taxi · 1M, first load

85.3 → 72.9 ms

1.2× quicker over 5 runs, 10-11 to 10-11 · Arrow 96.1 ms at the last

neo 72.9Arrow 96.110-1110-112026-10-11 09:04 · neo 85.3 ms · Arrow 103 ms · f1d835a2026-10-11 09:11 · neo 89.5 ms · Arrow 104 ms · f1d835a2026-10-11 09:26 · neo 89.6 ms · Arrow 104 ms · f1d835a2026-10-11 09:50 · neo 78.1 ms · Arrow 104 ms · f1d835a2026-10-11 16:15 · neo 72.9 ms · Arrow 96.1 ms · f1d835a

NYC taxi · 1M, loads after it

71.6 → 52.9 ms

1.4× quicker over 5 runs, 10-11 to 10-11 · Arrow 90.7 ms at the last

neo 52.9Arrow 90.710-1110-112026-10-11 09:04 · neo 71.6 ms · Arrow 99.0 ms · f1d835a2026-10-11 09:11 · neo 73.0 ms · Arrow 98.4 ms · f1d835a2026-10-11 09:26 · neo 74.0 ms · Arrow 98.0 ms · f1d835a2026-10-11 09:50 · neo 57.2 ms · Arrow 98.3 ms · f1d835a2026-10-11 16:15 · neo 52.9 ms · Arrow 90.7 ms · f1d835a

NYC taxi · 10M, first load

747 → 448 ms

1.7× quicker over 3 runs, 10-11 to 10-11 · Arrow 954 ms at the last

neo 448Arrow 95410-1110-112026-10-11 09:16 · busy machine · neo 747 ms · Arrow 1,011 ms · f1d835a2026-10-11 10:07 · neo 490 ms · Arrow 1,021 ms · f1d835a2026-10-11 16:34 · neo 448 ms · Arrow 954 ms · f1d835a

NYC taxi · 10M, loads after it

710 → 418 ms

1.7× quicker over 3 runs, 10-11 to 10-11 · Arrow 959 ms at the last

neo 418Arrow 95910-1110-112026-10-11 09:16 · busy machine · neo 710 ms · Arrow 1,011 ms · f1d835a2026-10-11 10:07 · neo 465 ms · Arrow 1,018 ms · f1d835a2026-10-11 16:34 · neo 418 ms · Arrow 959 ms · f1d835a

ClickBench · 1M, first load

185 → 126 ms

1.5× quicker over 6 runs, 10-11 to 10-11 · Polars 274 ms at the last

neo 126Polars 27410-1110-112026-10-11 09:06 · busy machine · neo 185 ms · Polars 291 ms · f1d835a2026-10-11 09:13 · busy machine · neo 192 ms · Polars 295 ms · f1d835a2026-10-11 09:30 · neo 206 ms · Polars 301 ms · f1d835a2026-10-11 09:52 · neo 141 ms · Polars 294 ms · f1d835a2026-10-11 10:27 · neo 145 ms · Polars 299 ms · f1d835a2026-10-11 16:21 · neo 126 ms · Polars 274 ms · f1d835a

ClickBench · 1M, loads after it

164 → 96.0 ms

1.7× quicker over 6 runs, 10-11 to 10-11 · Polars 189 ms at the last

neo 96.0Polars 18910-1110-112026-10-11 09:06 · busy machine · neo 164 ms · Polars 206 ms · f1d835a2026-10-11 09:13 · busy machine · neo 166 ms · Polars 203 ms · f1d835a2026-10-11 09:30 · neo 182 ms · Polars 219 ms · f1d835a2026-10-11 09:52 · neo 113 ms · Polars 208 ms · f1d835a2026-10-11 10:27 · neo 115 ms · Polars 216 ms · f1d835a2026-10-11 16:21 · neo 96.0 ms · Polars 189 ms · f1d835a

ClickBench · 10M, first load

2,070 → 1,053 ms

2.0× quicker over 3 runs, 10-11 to 10-11 · Polars 2,814 ms at the last

neo 1,053Polars 2,81410-1110-112026-10-11 09:22 · busy machine · neo 2,070 ms · Polars 3,017 ms · f1d835a2026-10-11 10:19 · neo 1,572 ms · Polars 3,042 ms · f1d835a2026-10-11 16:43 · neo 1,053 ms · Polars 2,814 ms · f1d835a

ClickBench · 10M, loads after it

2,045 → 1,056 ms

1.9× quicker over 3 runs, 10-11 to 10-11 · Polars 2,696 ms at the last

neo 1,056Polars 2,69610-1110-112026-10-11 09:22 · busy machine · neo 2,045 ms · Polars 2,972 ms · f1d835a2026-10-11 10:19 · neo 1,673 ms · Polars 2,980 ms · f1d835a2026-10-11 16:43 · neo 1,056 ms · Polars 2,696 ms · f1d835a
Every run as a table

worldcitiespop, first load · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:0229.229.851.42781,722
2026-10-11 09:09 · busy29.829.852.72801,739
2026-10-11 09:4625.629.649.22801,125
2026-10-11 16:1223.826.347.52521,072

worldcitiespop, loads after it · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:0219.326.642.81021,724
2026-10-11 09:09 · busy19.526.543.499.21,749
2026-10-11 09:4612.626.844.01021,108
2026-10-11 16:1211.423.039.991.81,053

NYC taxi · 1M, first load · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:0485.31031449373,665
2026-10-11 09:1189.51041469083,699
2026-10-11 09:2689.61041469083,696
2026-10-11 09:5078.11041469083,305
2026-10-11 16:1572.996.11428273,151

NYC taxi · 1M, loads after it · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:0471.699.01057253,679
2026-10-11 09:1173.098.41037163,707
2026-10-11 09:2674.098.01097303,658
2026-10-11 09:5057.298.31077403,201
2026-10-11 16:1552.990.795.36613,103

NYC taxi · 10M, first load · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:16 · busy7471,0111,3022,949—
2026-10-11 10:074901,0211,3313,04232,853
2026-10-11 16:344489541,2452,75231,837

NYC taxi · 10M, loads after it · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:16 · busy7101,0111,2672,648—
2026-10-11 10:074651,0181,2682,87932,863
2026-10-11 16:344189591,0982,53931,512

ClickBench · 1M, first load · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:06 · busy185—2911,7586,574
2026-10-11 09:13 · busy1924032951,7426,431
2026-10-11 09:302064133011,8356,517
2026-10-11 09:521414062941,765—
2026-10-11 10:271454022991,7806,527
2026-10-11 16:211263732741,6475,944

ClickBench · 1M, loads after it · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:06 · busy164—2061,5186,505
2026-10-11 09:13 · busy1664052031,5156,421
2026-10-11 09:301824192191,5416,497
2026-10-11 09:521134072081,523—
2026-10-11 10:271154062161,5286,498
2026-10-11 16:2196.03731891,4385,876

ClickBench · 10M, first load · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:22 · busy2,0704,0493,0174,887—
2026-10-11 10:191,5724,1473,0425,589—
2026-10-11 16:431,0533,7522,8144,626—

ClickBench · 10M, loads after it · ms

runneoArrowPolarsDuckDBpandas
2026-10-11 09:22 · busy2,0454,0992,9725,153—
2026-10-11 10:191,6734,1592,9805,640—
2026-10-11 16:431,0563,8292,6964,682—

Measured on Apple M5 Max, 18 cores, 26.4.1. Every point is a run a benchmark script appended to the engine's ledgers; nothing on this page was measured again for it.

All evalsEvery comparisonStart a conversation