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.
Latest · six architectural checkpoints ·
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
Checkpoint 1 / 6
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
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
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
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
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
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.
Baseline = 100 · lower uses less memory · two paired rounds
Full-command time: +0.35%
Full-command time: +2.63%
Full-command time: -0.95%
Full-command time: -0.56%
Baseline = 100 · lower uses less memory · two paired rounds
Full-command time: -25.68%
Full-command time: -24.38%
Full-command time: -27.17%
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
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
Manufacturer 128 · November · all years
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
Manager 1 · November 2000
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
Manager 28 · November 1999
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.
| Query / SF | Command s | Decode ms | Processor ms | Peak MiB | Groups → answer |
|---|---|---|---|---|---|
| Q3 / 0.1 | 0.148 | 65.0 | 18.1 | 69.2 | 15 → 15 |
| Q3 / 0.5 | 0.636 | 286 | 74.0 | 311 | 46 → 46 |
| Q3 / 1 | 1.28 | 578 | 146 | 613 | 89 → 89 |
| Q52 / 0.1 | 0.143 | 64.7 | 13.2 | 67.8 | 11 → 11 |
| Q52 / 0.5 | 0.629 | 291 | 63.0 | 311 | 60 → 60 |
| Q52 / 1 | 1.25 | 581 | 124 | 613 | 109 → 100 |
| Q55 / 0.1 | 0.143 | 64.7 | 13.0 | 67.8 | 20 → 20 |
| Q55 / 0.5 | 0.623 | 288 | 61.0 | 311 | 58 → 58 |
| Q55 / 1 | 1.25 | 585 | 120 | 613 | 104 → 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
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
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
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
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
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.
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.
Earlier · preliminary paired input screen · SF 0.1
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
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
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
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
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
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
Manufacturer 128 · November
17.84ms
native processor stages · median
Input decode: 133.96 ms median. 138 qualifying sales → 15 answer rows.
Ordered answer matched · exact cents
Manager 1 · November 2000
14.40ms
native processor stages · median
Input decode: 134.05 ms median. 112 qualifying sales → 11 answer rows.
Ordered answer matched · exact cents
Manager 28 · November 1999
14.50ms
native processor stages · median
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 ·
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
-18.77%
paired processor time · lower is better
Screen bound passed
Target pipeline
-23.52%
paired processor time · lower is better
Screen bound passed
Unchanged control
+0.46%
paired processor time · lower is better
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 ·
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
-94.95%
paired processor time · lower is better
Screen bound passed
Target processor
-90.94%
paired processor time · lower is better
Screen bound passed
Unchanged control
-1.03%
paired processor time · lower is better
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 ·
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
-48.25%
paired processor time · lower is better
Screen bound passed
Target processor
-29.41%
paired processor time · lower is better
Screen bound passed
Unchanged control
+0.48%
paired processor time · lower is better
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 ·
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
-99.12%
paired processor time · lower is better
Screen bound passed
Target processor
-95.87%
paired processor time · lower is better
Screen bound passed
Unchanged control
+1.66%
paired processor time · lower is better
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 ·
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
-9.37%
paired processor time · lower is better
Screen bound passed
Target pipeline
-2.14%
paired processor time · lower is better
Screen bound passed
Unchanged control
+89.77%
paired processor time · lower is better
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
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.
6 suite processes · 56.65 seconds total
Screen check missed
Screen check missed
Within control bound · unchanged code
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 →6 suite processes · 56.68 seconds total
Screen check missed
Screen check passed
Outside control bound · unchanged code
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.
Earlier same-day check · saved October 15 references
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.
| Workload | C++ measured | Rust saved | Swift saved | Zig saved | Go saved |
|---|---|---|---|---|---|
| Filter rows (amount > 500) | 0.026 ms | C++ 1.42× faster0.037 ms | C++ 1.62× faster0.042 ms | C++ 1.15× faster0.030 ms | C++ 2.46× faster0.064 ms |
| Sort row order | 4.22 ms | C++ 3.80× slower1.11 ms | C++ 3.70× slower1.14 ms | C++ 3.05× slower1.39 ms | C++ 2.84× slower1.49 ms |
| Build a sorted table | 6.79 ms | C++ 1.75× slower3.89 ms | C++ 1.10× faster7.50 ms | C++ 1.63× slower4.17 ms | C++ 1.16× slower5.85 ms |
| Sum by region | 0.023 ms | C++ 1.83× faster0.042 ms | C++ 1.35× faster0.031 ms | C++ 1.04× faster0.024 ms | C++ 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.
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.
Saved language comparison · 2026-10-15 08:22
1,000,000 rows; saved measurements on Apple M5 Max, 18 cores, 26.4.1
| Workload | C++ | Rust | Swift | Zig | Go |
|---|---|---|---|---|---|
| Load typed CSV | 2.89 ms | 1.22×3.53 ms | 1.14×3.29 ms | 1.39×4.03 ms | 1.72×4.98 ms |
| Filter rows | 0.018 ms | 2.06×0.037 ms | 2.33×0.042 ms | 1.67×0.030 ms | 3.56×0.064 ms |
| Sort row order | 1.04 ms | 1.07×1.11 ms | 1.10×1.14 ms | 1.34×1.39 ms | 1.43×1.49 ms |
| Build a sorted table | 2.85 ms | 1.36×3.89 ms | 2.63×7.50 ms | 1.46×4.17 ms | 2.05×5.85 ms |
| Sum by region | 0.020 ms | 2.10×0.042 ms | 1.55×0.031 ms | 1.20×0.024 ms | 3.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
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.
93.3%
less paired time · Native job time
250,000 rows and distinct groups; sum, average, min, max and count
Change interval [-94.43%, -91.96%]
11 / 11 controls passed · 288 exact-output calls
Method and evidence →32.2%
less paired time · Native job time
One-million-row count and join
Change interval [-38.45%, -25.39%]
11 / 11 controls passed · 2,400 exact-output calls
Method and evidence →94.7%
less paired time · Full command: startup through exit
Small pipeline
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.
Version IDs, release decisions, all endpoint results and earlier rejected candidates are retained here. The latest accepted follow-up is shown first.
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.
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
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
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
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.
Completed study · V13 · kept
V13 is retained as the accepted version; V11 remains the immutable comparison baseline.
V13 interrupts idle shutdown waits. The operator kernels and both timer boundaries are unchanged; this is a lifecycle result.
-94.65%
[-96.75%, -91.21%] · Gate passed
-93.90%
[-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.
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.
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.
-22.89% native wall
[-29.00%, -16.25%] · Pass
-23.26% native wall
[-29.42%, -16.56%] · Pass
-21.13% native wall
[-29.05%, -12.33%] · Pass
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.
| Workflow | Full command | Command gate | Native wall | Wall 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 |
These are the earlier trial decisions. The V13 follow-up above is the current accepted version.
32.2%
lower paired native wall time
Million-row count + join
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 →87.4%
lower paired full-command time
Small pipeline · shutdown experiment
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
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.
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
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.
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.
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
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
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
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
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
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
load the CSV · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:52 · busy | 10.4 | 17.2 | 65.1 | 256 | 412 |
| 2026-10-08 20:08 · busy | 8.78 | 15.6 | 57.3 | 241 | 426 |
| 2026-10-10 11:52 · busy | 8.31 | 15.6 | 49.2 | 227 | 389 |
| 2026-10-10 12:00 | 8.89 | 15.5 | 50.0 | 240 | 343 |
| 2026-10-11 10:29 | 4.31 | 16.6 | 54.2 | 255 | 412 |
| 2026-10-11 16:03 | 2.95 | 16.9 | 49.0 | 241 | 383 |
| 2026-10-11 17:08 | 2.89 | 15.6 | 51.3 | 234 | 378 |
| 2026-10-11 17:31 | 2.92 | 15.3 | 51.0 | 237 | 375 |
| 2026-10-11 21:01 | 2.83 | 15.1 | 53.3 | 227 | 356 |
| 2026-10-11 21:13 | 2.93 | 14.8 | 51.6 | 234 | 354 |
| 2026-10-11 21:23 | 2.77 | 15.2 | 51.8 | 229 | 359 |
filter, count · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:52 · busy | 0.021 | 0.198 | 0.626 | 0.337 | 43.7 |
| 2026-10-08 20:08 · busy | 0.014 | 0.208 | 0.622 | 0.333 | 40.9 |
| 2026-10-10 11:52 · busy | 0.014 | 0.219 | 0.568 | 0.327 | 35.3 |
| 2026-10-10 12:00 | 0.014 | 0.191 | 0.572 | 0.333 | 41.4 |
| 2026-10-11 10:29 | 0.014 | 0.201 | 0.644 | 0.331 | 43.1 |
| 2026-10-11 16:03 | 0.014 | 0.177 | 0.566 | 0.315 | 39.1 |
| 2026-10-11 17:08 | 0.014 | 0.171 | 0.553 | 0.328 | 35.0 |
| 2026-10-11 17:31 | 0.014 | 0.178 | 0.582 | 0.345 | 39.1 |
| 2026-10-11 21:01 | 0.017 | 0.187 | 0.534 | 0.328 | 37.6 |
| 2026-10-11 21:13 | 0.017 | 0.178 | 0.554 | 0.324 | 34.5 |
| 2026-10-11 21:23 | 0.018 | 0.179 | 0.602 | 0.328 | 36.9 |
filter into a new table · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:52 · busy | 1.40 | 1.08 | 43.8 | 12.7 | 24.3 |
| 2026-10-08 20:08 · busy | 0.415 | 1.06 | 41.6 | 12.5 | 24.9 |
| 2026-10-10 11:52 · busy | 0.319 | 0.938 | 40.1 | 12.0 | 22.1 |
| 2026-10-10 12:00 | 0.295 | 1.09 | 40.2 | 11.9 | 24.1 |
| 2026-10-11 10:29 | 0.490 | 1.14 | 43.3 | 12.9 | 24.5 |
| 2026-10-11 16:03 | 0.383 | 1.06 | 40.2 | 11.9 | 25.6 |
| 2026-10-11 17:08 | 0.333 | 1.09 | 40.4 | 11.9 | 23.3 |
| 2026-10-11 17:31 | 0.316 | 1.06 | 42.2 | 12.1 | 22.5 |
| 2026-10-11 21:01 | 0.364 | 0.908 | 40.2 | 11.7 | 24.2 |
| 2026-10-11 21:13 | 0.319 | 0.999 | 39.8 | 11.7 | 20.7 |
| 2026-10-11 21:23 | 0.380 | 0.889 | 40.3 | 11.8 | 22.0 |
sort, as a permutation · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:52 · busy | 1.05 | 7.34 | — | 71.7 | — |
| 2026-10-08 20:08 · busy | 1.07 | 7.27 | — | 69.8 | — |
| 2026-10-10 11:52 · busy | 1.05 | 6.35 | — | 65.2 | — |
| 2026-10-10 12:00 | 1.06 | 6.62 | — | 65.2 | — |
| 2026-10-11 10:29 | 1.06 | 7.23 | — | 71.3 | — |
| 2026-10-11 16:03 | 1.03 | 7.11 | — | 65.6 | — |
| 2026-10-11 17:08 | 1.02 | 6.80 | — | 66.6 | — |
| 2026-10-11 17:31 | 1.03 | 7.18 | — | 66.4 | — |
| 2026-10-11 21:01 | 1.04 | 6.58 | — | 64.1 | — |
| 2026-10-11 21:13 | 1.06 | 6.83 | — | 64.7 | — |
| 2026-10-11 21:23 | 1.03 | 6.68 | — | 64.8 | — |
sort into a new table · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:52 · busy | 3.07 | 13.7 | 27.6 | 142 | 135 |
| 2026-10-08 20:08 · busy | 2.98 | 12.4 | 25.0 | 126 | 124 |
| 2026-10-10 11:52 · busy | 2.77 | 10.7 | 23.2 | 113 | 123 |
| 2026-10-10 12:00 | 2.72 | 11.8 | 24.8 | 115 | 119 |
| 2026-10-11 10:29 | 2.91 | 13.7 | 27.6 | 129 | 134 |
| 2026-10-11 16:03 | 2.75 | 12.5 | 24.2 | 119 | 117 |
| 2026-10-11 17:08 | 2.74 | 11.7 | 24.8 | 112 | 112 |
| 2026-10-11 17:31 | 2.75 | 12.1 | 25.5 | 114 | 116 |
| 2026-10-11 21:01 | 2.69 | 11.8 | 23.2 | 111 | 116 |
| 2026-10-11 21:13 | 2.76 | 12.2 | 23.9 | 109 | 121 |
| 2026-10-11 21:23 | 2.72 | 12.2 | 23.4 | 110 | 122 |
sum by region · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:52 · busy | 0.051 | 2.04 | 2.75 | 13.2 | 53.6 |
| 2026-10-08 20:08 · busy | 0.035 | 1.55 | 2.52 | 12.6 | 46.5 |
| 2026-10-10 11:52 · busy | 0.032 | 1.49 | 2.28 | 12.4 | 45.0 |
| 2026-10-10 12:00 | 0.032 | 1.61 | 2.31 | 12.4 | 42.1 |
| 2026-10-11 10:29 | 0.035 | 1.61 | 2.40 | 13.5 | 45.2 |
| 2026-10-11 16:03 | 0.024 | 1.60 | 2.28 | 12.3 | 43.0 |
| 2026-10-11 17:08 | 0.019 | 1.41 | 2.29 | 12.8 | 40.2 |
| 2026-10-11 17:31 | 0.019 | 1.57 | 2.30 | 12.4 | 42.1 |
| 2026-10-11 21:01 | 0.020 | 1.70 | 2.30 | 12.2 | 40.4 |
| 2026-10-11 21:13 | 0.020 | 1.52 | 2.27 | 12.0 | 40.9 |
| 2026-10-11 21:23 | 0.020 | 1.55 | 2.24 | 12.2 | 39.0 |
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
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
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
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
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
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
load the CSV · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:53 · busy | 78.8 | 348 | 1,490 | 2,675 | 2,651 |
| 2026-10-08 20:09 · busy | 90.7 | 130 | 392 | 2,522 | 2,970 |
| 2026-10-10 11:52 · busy | 85.8 | 120 | 195 | 2,365 | 1,327 |
| 2026-10-10 12:01 | 81.8 | 119 | 204 | 2,420 | 1,504 |
| 2026-10-11 10:30 | 34.8 | 129 | 215 | 2,566 | 1,420 |
| 2026-10-11 16:04 | 23.6 | 128 | 209 | 2,376 | 1,515 |
| 2026-10-11 17:09 | 23.9 | 132 | 220 | 2,422 | 1,387 |
| 2026-10-11 17:31 | 24.1 | 130 | 199 | 2,465 | 1,541 |
| 2026-10-11 21:02 | 21.9 | 117 | 200 | 2,428 | 1,372 |
| 2026-10-11 21:14 | 22.3 | 114 | 214 | 2,335 | 1,472 |
| 2026-10-11 21:24 | 21.7 | 114 | 213 | 2,343 | 1,450 |
filter, count · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:53 · busy | 0.341 | 1.29 | 3.83 | 3.89 | 79.5 |
| 2026-10-08 20:09 · busy | 0.324 | 0.678 | 4.12 | 3.72 | 68.8 |
| 2026-10-10 11:52 · busy | 0.305 | 0.616 | 2.19 | 3.08 | 42.5 |
| 2026-10-10 12:01 | 0.315 | 0.631 | 2.20 | 3.08 | 42.3 |
| 2026-10-11 10:30 | 0.322 | 0.621 | 2.32 | 3.18 | 47.1 |
| 2026-10-11 16:04 | 0.317 | 0.617 | 2.19 | 3.10 | 46.6 |
| 2026-10-11 17:09 | 0.322 | 0.626 | 2.21 | 3.08 | 40.6 |
| 2026-10-11 17:31 | 0.315 | 0.619 | 2.20 | 3.15 | 45.1 |
| 2026-10-11 21:02 | 0.313 | 0.596 | 2.09 | 3.06 | 42.5 |
| 2026-10-11 21:14 | 0.312 | 0.636 | 2.19 | 3.06 | 41.4 |
| 2026-10-11 21:24 | 0.317 | 0.621 | 2.13 | 3.12 | 39.3 |
filter into a new table · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:53 · busy | 4.04 | 17.4 | 948 | 155 | 114 |
| 2026-10-08 20:09 · busy | 3.39 | 8.57 | 485 | 154 | 102 |
| 2026-10-10 11:52 · busy | 3.42 | 8.91 | 246 | 140 | 69.1 |
| 2026-10-10 12:01 | 3.43 | 7.63 | 264 | 136 | 65.8 |
| 2026-10-11 10:30 | 3.55 | 7.66 | 299 | 152 | 78.9 |
| 2026-10-11 16:04 | 3.50 | 7.92 | 293 | 140 | 69.2 |
| 2026-10-11 17:09 | 3.43 | 8.73 | 274 | 139 | 75.9 |
| 2026-10-11 17:31 | 3.42 | 6.85 | 276 | 141 | 64.4 |
| 2026-10-11 21:02 | 3.66 | 7.39 | 216 | 142 | 61.6 |
| 2026-10-11 21:14 | 3.45 | 7.21 | 234 | 141 | 63.0 |
| 2026-10-11 21:24 | 3.40 | 9.13 | 328 | 139 | 65.1 |
sort, as a permutation · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:53 · busy | 12.9 | 153 | — | 945 | — |
| 2026-10-08 20:09 · busy | 9.69 | 99.4 | — | 870 | — |
| 2026-10-10 11:52 · busy | 9.19 | 69.1 | — | 809 | — |
| 2026-10-10 12:01 | 9.39 | 70.3 | — | 804 | — |
| 2026-10-11 10:30 | 9.88 | 75.6 | — | 873 | — |
| 2026-10-11 16:04 | 9.66 | 73.2 | — | 808 | — |
| 2026-10-11 17:09 | 9.35 | 69.7 | — | 813 | — |
| 2026-10-11 17:31 | 9.43 | 69.8 | — | 837 | — |
| 2026-10-11 21:02 | 9.19 | 72.7 | — | 794 | — |
| 2026-10-11 21:14 | 9.31 | 71.6 | — | 787 | — |
| 2026-10-11 21:24 | 9.39 | 71.4 | — | 798 | — |
sort into a new table · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:53 · busy | 68.3 | 812 | 1,015 | 2,809 | 765 |
| 2026-10-08 20:09 · busy | 64.0 | 174 | 208 | 2,028 | 896 |
| 2026-10-10 11:52 · busy | 63.0 | 132 | 171 | 1,928 | 469 |
| 2026-10-10 12:01 | 63.1 | 122 | 190 | 1,961 | 475 |
| 2026-10-11 10:30 | 65.6 | 137 | 217 | 2,176 | 522 |
| 2026-10-11 16:04 | 64.2 | 132 | 188 | 2,056 | 451 |
| 2026-10-11 17:09 | 63.4 | 125 | 176 | 1,960 | 504 |
| 2026-10-11 17:31 | 63.2 | 125 | 188 | 2,040 | 484 |
| 2026-10-11 21:02 | 62.4 | 137 | 189 | 1,912 | 459 |
| 2026-10-11 21:14 | 62.3 | 145 | 179 | 1,900 | 467 |
| 2026-10-11 21:24 | 62.6 | 139 | 188 | 1,913 | 469 |
sum by region · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 19:53 · busy | 0.490 | 106 | 30.4 | 179 | 128 |
| 2026-10-08 20:09 · busy | 0.481 | 10.7 | 13.7 | 157 | 112 |
| 2026-10-10 11:52 · busy | 0.474 | 6.69 | 9.18 | 137 | 69.7 |
| 2026-10-10 12:01 | 0.482 | 6.83 | 9.24 | 140 | 70.1 |
| 2026-10-11 10:30 | 0.501 | 6.34 | 9.43 | 152 | 82.1 |
| 2026-10-11 16:04 | 0.476 | 6.04 | 8.95 | 139 | 64.7 |
| 2026-10-11 17:09 | 0.468 | 6.26 | 9.04 | 139 | 72.7 |
| 2026-10-11 17:31 | 0.475 | 6.02 | 9.17 | 140 | 76.2 |
| 2026-10-11 21:02 | 0.465 | 5.95 | 9.11 | 141 | 63.6 |
| 2026-10-11 21:14 | 0.466 | 5.60 | 8.94 | 138 | 62.3 |
| 2026-10-11 21:24 | 0.401 | 6.03 | 8.96 | 142 | 66.1 |
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
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
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
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
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
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
load the CSV · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 20:16 · busy | 1,465 | 1,715 | 3,976 | 33,844 | 29,040 |
| 2026-10-10 11:58 · busy | 909 | 1,203 | 2,315 | 26,501 | 16,694 |
| 2026-10-10 12:08 | 861 | 1,227 | 2,452 | 27,357 | 13,784 |
| 2026-10-11 10:38 | 409 | 1,340 | 2,638 | 28,527 | 14,573 |
| 2026-10-11 16:09 | 299 | 1,210 | 2,288 | 28,081 | 14,524 |
| 2026-10-11 17:15 | 285 | 1,203 | 2,375 | 26,600 | 14,249 |
| 2026-10-11 17:38 | 279 | 1,206 | 2,356 | 26,817 | 16,094 |
| 2026-10-11 21:07 | 244 | 1,165 | 2,374 | 26,868 | 15,837 |
| 2026-10-11 21:20 | 244 | 1,132 | 2,386 | 26,444 | 15,666 |
| 2026-10-11 21:29 | 249 | 1,186 | 2,388 | 27,009 | 15,900 |
filter, count · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 20:16 · busy | 3.52 | 4.67 | 21.7 | 39.1 | 167 |
| 2026-10-10 11:58 · busy | 3.01 | 3.95 | 18.7 | 30.6 | 137 |
| 2026-10-10 12:08 | 2.89 | 4.31 | 19.1 | 30.6 | 134 |
| 2026-10-11 10:38 | 3.09 | 4.48 | 19.7 | 31.4 | 136 |
| 2026-10-11 16:09 | 3.13 | 4.43 | 18.9 | 30.4 | 124 |
| 2026-10-11 17:15 | 2.91 | 4.15 | 18.9 | 30.6 | 132 |
| 2026-10-11 17:38 | 2.91 | 4.27 | 18.4 | 30.4 | 132 |
| 2026-10-11 21:07 | 2.92 | 4.12 | 18.2 | 30.4 | 129 |
| 2026-10-11 21:20 | 3.00 | 4.34 | 18.1 | 30.4 | 130 |
| 2026-10-11 21:29 | 2.98 | 4.45 | 18.4 | 30.4 | 131 |
filter into a new table · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 20:16 · busy | 48.1 | 151 | 2,438 | 1,578 | 1,361 |
| 2026-10-10 11:58 · busy | 35.4 | 136 | 1,680 | 1,504 | 691 |
| 2026-10-10 12:08 | 34.3 | 125 | 1,677 | 1,475 | 716 |
| 2026-10-11 10:38 | 36.5 | 137 | 2,192 | 1,615 | 719 |
| 2026-10-11 16:09 | 35.6 | 100.0 | 1,533 | 1,531 | 626 |
| 2026-10-11 17:15 | 34.7 | 125 | 1,831 | 1,549 | 711 |
| 2026-10-11 17:38 | 34.4 | 116 | 1,624 | 1,431 | 708 |
| 2026-10-11 21:07 | 34.2 | 119 | 1,670 | 1,459 | 696 |
| 2026-10-11 21:20 | 33.9 | 113 | 1,721 | 1,474 | 687 |
| 2026-10-11 21:29 | 34.3 | 111 | 1,753 | 1,541 | 693 |
sort, as a permutation · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 20:16 · busy | 150 | 1,560 | — | 10,093 | — |
| 2026-10-10 11:58 · busy | 98.9 | 1,000 | — | 9,706 | — |
| 2026-10-10 12:08 | 100 | 1,107 | — | 10,051 | — |
| 2026-10-11 10:38 | 104 | 1,144 | — | 10,835 | — |
| 2026-10-11 16:09 | 102 | 1,055 | — | 9,821 | — |
| 2026-10-11 17:15 | 101 | 1,055 | — | 9,929 | — |
| 2026-10-11 17:38 | 99.9 | 1,083 | — | 9,866 | — |
| 2026-10-11 21:07 | 99.1 | 983 | — | 9,615 | — |
| 2026-10-11 21:20 | 99.4 | 970 | — | 9,735 | — |
| 2026-10-11 21:29 | 99.6 | 1,031 | — | 9,765 | — |
sort into a new table · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 20:16 · busy | 1,483 | 2,490 | 4,453 | 24,679 | 8,585 |
| 2026-10-10 11:58 · busy | 752 | 1,716 | 3,059 | 23,394 | 5,289 |
| 2026-10-10 12:08 | 750 | 1,677 | 2,889 | 23,562 | 5,211 |
| 2026-10-11 10:38 | 771 | 1,833 | 3,595 | 25,418 | 5,392 |
| 2026-10-11 16:09 | 759 | 1,693 | 2,929 | 23,451 | 4,653 |
| 2026-10-11 17:15 | 750 | 1,658 | 2,930 | 23,554 | 5,383 |
| 2026-10-11 17:38 | 747 | 1,614 | 2,647 | 23,179 | 5,173 |
| 2026-10-11 21:07 | 745 | 1,547 | 2,702 | 22,706 | 4,830 |
| 2026-10-11 21:20 | 744 | 1,522 | 2,929 | 23,092 | 4,834 |
| 2026-10-11 21:29 | 744 | 1,542 | 2,875 | 23,277 | 4,970 |
sum by region · ms
| run | neo | Polars | DuckDB | pandas | Spark |
|---|---|---|---|---|---|
| 2026-10-08 20:16 · busy | 5.41 | 85.8 | 99.8 | 1,452 | 803 |
| 2026-10-10 11:58 · busy | 5.06 | 55.7 | 81.3 | 1,401 | 477 |
| 2026-10-10 12:08 | 5.08 | 53.7 | 82.8 | 1,415 | 454 |
| 2026-10-11 10:38 | 4.94 | 56.8 | 85.4 | 1,530 | 473 |
| 2026-10-11 16:09 | 4.24 | 51.3 | 80.7 | 1,419 | 401 |
| 2026-10-11 17:15 | 4.21 | 53.4 | 82.3 | 1,444 | 466 |
| 2026-10-11 17:38 | 4.07 | 52.5 | 83.5 | 1,403 | 453 |
| 2026-10-11 21:07 | 4.08 | 52.1 | 81.1 | 1,396 | 414 |
| 2026-10-11 21:20 | 4.10 | 52.7 | 82.1 | 1,399 | 415 |
| 2026-10-11 21:29 | 4.11 | 52.8 | 84.4 | 1,398 | 432 |
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
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
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
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
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
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
load, the parse loop in process, 1M rows · ms
| run | neo | Go | Rust | Swift | Zig |
|---|---|---|---|---|---|
| 2026-10-10 16:21 · busy | 5.82 | — | 3.06 | — | — |
| 2026-10-10 17:35 | 5.09 | — | 2.98 | — | — |
| 2026-10-10 18:11 · busy | 5.45 | — | 2.95 | — | — |
| 2026-10-10 21:53 | 4.87 | — | 3.22 | — | — |
| 2026-10-11 08:14 · busy | 3.58 | — | 3.09 | — | — |
| 2026-10-11 14:11 | 2.79 | — | 3.11 | — | — |
cold load, a fresh process, 1M rows · ms
| run | neo | Go | Rust | Swift | Zig |
|---|---|---|---|---|---|
| 2026-10-12 06:38 | 8.96 | 10.4 | 7.29 | 6.69 | 4.45 |
| 2026-10-12 07:17 | 5.96 | 9.97 | 6.26 | 6.54 | 4.32 |
load, the parse loop in process, 10M rows · ms
| run | neo | Go | Rust | Swift | Zig |
|---|---|---|---|---|---|
| 2026-10-10 16:21 · busy | 44.5 | — | 34.4 | — | — |
| 2026-10-10 17:35 · busy | 41.6 | — | 38.0 | — | — |
| 2026-10-10 18:11 · busy | 44.1 | — | 35.6 | — | — |
| 2026-10-10 21:53 | 36.6 | — | 36.3 | — | — |
| 2026-10-11 08:14 · busy | 28.9 | — | 34.5 | — | — |
| 2026-10-11 14:11 · busy | 21.1 | — | 32.6 | — | — |
cold load, a fresh process, 10M rows · ms
| run | neo | Go | Rust | Swift | Zig |
|---|---|---|---|---|---|
| 2026-10-12 06:44 | 45.0 | 79.9 | 58.3 | 59.7 | 39.8 |
| 2026-10-12 07:18 | 43.3 | 77.3 | 56.5 | 55.4 | 38.8 |
load, the parse loop in process, 100M rows · ms
| run | neo | Go | Rust | Swift | Zig |
|---|---|---|---|---|---|
| 2026-10-10 16:21 · busy | 632 | — | 367 | — | — |
| 2026-10-10 21:54 · busy | 500 | — | 298 | — | — |
cold load, a fresh process, 100M rows · ms
| run | neo | Go | Rust | Swift | Zig |
|---|---|---|---|---|---|
| 2026-10-12 07:12 | 420 | 726 | 504 | 482 | 448 |
| 2026-10-12 07:19 | 426 | 734 | 542 | 496 | 454 |
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
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
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
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
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
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
ClickBench · 1M, first load
185 → 126 ms
1.5× quicker over 6 runs, 10-11 to 10-11 · Polars 274 ms at the last
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
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
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
worldcitiespop, first load · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:02 | 29.2 | 29.8 | 51.4 | 278 | 1,722 |
| 2026-10-11 09:09 · busy | 29.8 | 29.8 | 52.7 | 280 | 1,739 |
| 2026-10-11 09:46 | 25.6 | 29.6 | 49.2 | 280 | 1,125 |
| 2026-10-11 16:12 | 23.8 | 26.3 | 47.5 | 252 | 1,072 |
worldcitiespop, loads after it · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:02 | 19.3 | 26.6 | 42.8 | 102 | 1,724 |
| 2026-10-11 09:09 · busy | 19.5 | 26.5 | 43.4 | 99.2 | 1,749 |
| 2026-10-11 09:46 | 12.6 | 26.8 | 44.0 | 102 | 1,108 |
| 2026-10-11 16:12 | 11.4 | 23.0 | 39.9 | 91.8 | 1,053 |
NYC taxi · 1M, first load · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:04 | 85.3 | 103 | 144 | 937 | 3,665 |
| 2026-10-11 09:11 | 89.5 | 104 | 146 | 908 | 3,699 |
| 2026-10-11 09:26 | 89.6 | 104 | 146 | 908 | 3,696 |
| 2026-10-11 09:50 | 78.1 | 104 | 146 | 908 | 3,305 |
| 2026-10-11 16:15 | 72.9 | 96.1 | 142 | 827 | 3,151 |
NYC taxi · 1M, loads after it · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:04 | 71.6 | 99.0 | 105 | 725 | 3,679 |
| 2026-10-11 09:11 | 73.0 | 98.4 | 103 | 716 | 3,707 |
| 2026-10-11 09:26 | 74.0 | 98.0 | 109 | 730 | 3,658 |
| 2026-10-11 09:50 | 57.2 | 98.3 | 107 | 740 | 3,201 |
| 2026-10-11 16:15 | 52.9 | 90.7 | 95.3 | 661 | 3,103 |
NYC taxi · 10M, first load · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:16 · busy | 747 | 1,011 | 1,302 | 2,949 | — |
| 2026-10-11 10:07 | 490 | 1,021 | 1,331 | 3,042 | 32,853 |
| 2026-10-11 16:34 | 448 | 954 | 1,245 | 2,752 | 31,837 |
NYC taxi · 10M, loads after it · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:16 · busy | 710 | 1,011 | 1,267 | 2,648 | — |
| 2026-10-11 10:07 | 465 | 1,018 | 1,268 | 2,879 | 32,863 |
| 2026-10-11 16:34 | 418 | 959 | 1,098 | 2,539 | 31,512 |
ClickBench · 1M, first load · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:06 · busy | 185 | — | 291 | 1,758 | 6,574 |
| 2026-10-11 09:13 · busy | 192 | 403 | 295 | 1,742 | 6,431 |
| 2026-10-11 09:30 | 206 | 413 | 301 | 1,835 | 6,517 |
| 2026-10-11 09:52 | 141 | 406 | 294 | 1,765 | — |
| 2026-10-11 10:27 | 145 | 402 | 299 | 1,780 | 6,527 |
| 2026-10-11 16:21 | 126 | 373 | 274 | 1,647 | 5,944 |
ClickBench · 1M, loads after it · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:06 · busy | 164 | — | 206 | 1,518 | 6,505 |
| 2026-10-11 09:13 · busy | 166 | 405 | 203 | 1,515 | 6,421 |
| 2026-10-11 09:30 | 182 | 419 | 219 | 1,541 | 6,497 |
| 2026-10-11 09:52 | 113 | 407 | 208 | 1,523 | — |
| 2026-10-11 10:27 | 115 | 406 | 216 | 1,528 | 6,498 |
| 2026-10-11 16:21 | 96.0 | 373 | 189 | 1,438 | 5,876 |
ClickBench · 10M, first load · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:22 · busy | 2,070 | 4,049 | 3,017 | 4,887 | — |
| 2026-10-11 10:19 | 1,572 | 4,147 | 3,042 | 5,589 | — |
| 2026-10-11 16:43 | 1,053 | 3,752 | 2,814 | 4,626 | — |
ClickBench · 10M, loads after it · ms
| run | neo | Arrow | Polars | DuckDB | pandas |
|---|---|---|---|---|---|
| 2026-10-11 09:22 · busy | 2,045 | 4,099 | 2,972 | 5,153 | — |
| 2026-10-11 10:19 | 1,673 | 4,159 | 2,980 | 5,640 | — |
| 2026-10-11 16:43 | 1,056 | 3,829 | 2,696 | 4,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.