Repository navigation
Add planner-owned selection and bounded ListLayout scans to V2 - #10537
joseph-isaacs wants to merge 7 commits into
Conversation
Merging this PR will degrade performance by 27.68%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ❌ | WallTime | filter_neon[64] |
1.8 µs | 3.4 µs | -47.05% |
| ❌ | WallTime | filter_neon[8] |
959 ns | 1,620 ns | -40.8% |
| ❌ | WallTime | threshold_neon[80] |
3.5 µs | 4.9 µs | -28.21% |
| ❌ | WallTime | threshold_neon[8] |
1.4 µs | 1.9 µs | -25.45% |
| ❌ | WallTime | filter_neon[80] |
2.7 µs | 3.3 µs | -19.25% |
| ❌ | WallTime | threshold_neon[64] |
2.7 µs | 3.1 µs | -13.74% |
| ❌ | Simulation | isolated_runs[u32, (16, 0)] |
78.5 µs | 88.6 µs | -11.44% |
| 🆕 | Simulation | list_scan[false, 1024] |
N/A | 254.9 µs | N/A |
| 🆕 | Simulation | list_scan[false, 128] |
N/A | 238 µs | N/A |
| 🆕 |
Simulation | list_scan[false, 8] |
N/A | 591.7 µs | N/A |
| 🆕 | Simulation | list_scan[true, 1024] |
N/A | 1.9 ms | N/A |
| 🆕 | Simulation | list_scan[true, 128] |
N/A | 1.9 ms | N/A |
| 🆕 | Simulation | list_scan[true, 8] |
N/A | 1.3 ms | N/A |
Tip
Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.
Comparing ji/decompression-v2-scan (fe25a60) with develop (8c2534e)
Footnotes
-
12 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
6b97c79 to
15f2fed
Compare
15f2fed to
02119f6
Compare
Run the unchanged full 48-case Arrow comparison and 36-case standard suite, including parent and candidate V1 controls for the standard suite. Use the same CI-only wrapper as ccbe15b and baseline 5231b70. Runtime source is 8442d46, tree-equivalent to local 95fda7fc8. The previous run 38972129118 is complete. It confirmed the offset-copy feature-vector improvements but retained one +5.2% Arrow rerun. This run checks the combined offset-copy, generated-offset-statistics, and guarded list-overlap changes. Keep PR #10537 draft; this run is not a merge gate. Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Rebase draft PR #10537 onto develop 92a7db0. Apply selections through a composable planner, resolve list offsets before selected elements, and split substantial fixed-width child projections at stored segment boundaries. The projection planner owns subdivision, byte-budget admission, child task execution and ordered collection. Unsupported splits retain the serial path. Keep Planner and Morsel trait methods unchanged. Replace the experimental completion callbacks, WorkFuture and ChildExecutor traits with one PlannerOutput::Await variant; morsels only publish the assembled result. Preserve develop's global local-file coalescing configuration. The 8 KiB experiment caused tiny-lookup regressions and is not part of this version. Preserve masked lazy lowering, bounded dense-list grouping, shared value caches, validated chunk offsets and the fieldless nullable-struct fix. Retain the diagnostic examples and regression benchmark workflow. Backtracking: previous PR head 8442d46; experimental CI head 60fda25; local pre-review checkpoint a253e5727 and reviewed checkpoint e8fd21a4a. The byte budget covers in-flight decoded work, not retained output or encoded/coalesced buffers. Full performance revalidation remains necessary. Validation: 692 layout and 79 scan library tests passed, followed by all 7 await protocol tests including an additional await/IO regression. Scoped all-target/all-feature clippy passed with -D warnings; formatted with nightly-2026-09-10. Focused E2E measurements follow this checkpoint. Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
8442d46 to
c4fa781
Compare
Use the planner-driven V2 ScanBuilder directly for every Vortex random access measurement, including object-store reads. Remove the reader toggle, its configuration plumbing, V1 documentation, and unused reader-cache setup. Remove the experiment-only regression workflow, driver script, and three fixture/selection examples, along with their futures dev dependency. Keep the planner implementation and regression tests. The previous commit c4fa781 preserves the diagnostic harnesses and benchmark context. Inspected the resulting diff and searched for stale switch/example references. No tests, builds, or benchmarks were rerun for this cleanup. Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Polar Signals Profiling ResultsLatest Run
Previous Runs (5)
Powered by Polar Signals Cloud |
Benchmarks: Random Access 📖Commits: PR How to read Verdict and Engines
vortex / arrow-ipc / ns (1.066x ➖, 0↑ 2↓)
random-access / vortex-file-compressed / ns (0.905x ➖, 8↑ 1↓)
random-access / parquet / ns (0.989x ➖, 1↑ 0↓)
random-access / lance / ns (1.004x ➖, 0↑ 0↓)
|
Benchmarks: Compression 📖Commits: PR vortex / vortex-file-compressed / ns (0.999x ➖, 0↑ 0↓)
vortex / vortex-file-compressed / bytes (1.000x ➖, 0↑ 0↓)
vortex / vortex-file-compressed / ratio (1.000x ➖, 0↑ 0↓)
vortex / parquet / ns (0.999x ➖, 0↑ 0↓)
vortex / parquet / bytes (1.000x ➖, 0↑ 0↓)
vortex / arrow-ipc / ns (0.970x ➖, 5↑ 1↓)
vortex / arrow-ipc / bytes (1.000x ➖, 0↑ 0↓)
|
Add an opt-in prototype that compiles list element pipelines before offsets and validity resolve, then wakes their sources with the selected ranges. Keep the existing list implementation as the default and comparison control. Restore selection diagnostics and generate primitive, nested and short ListLayout fixtures. The random-access benchmark label now runs reference checks and alternating comparisons, with raw results uploaded as an artifact. Local validation: 72 reference checks and 32 timing cases, plus a reduced-iteration run of the CI comparison harness. This prototype does not yet implement the decoded-work admission budget or shared segment optimization. Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Signed-off-by: Joe Isaacs <joe.isaacs@live.co.uk>
Masked scans apply selection through a planner before projection. ListLayout scans resolve selected offsets and validity before reading elements, and the projection planner can subdivide large fixed-width element ranges into independently scheduled work.
Based on develop
92a7db079. The default implementation owns subdivision, a shared 32 MiB decoded-work admission budget, child execution and ordered result collection. Small, repeated-segment, oversized-segment and unsupported work retain the serial pipeline.PlannerOutput::Awaitlets the driver suspend a planner while its child tasks finish; existingPlanner,Morsel,Source,IoSourceandSegmentSourcemethods are unchanged.The opt-in comparison path (
VORTEX_LIST_PIPELINE=1) now hands selected element views to the enclosing planner. List sources first resolve offsets and validity, then describe the element plan with selected row ranges and masks. The planner builds a separate small graph for that view and returns its arrays to the waiting list source.SelectedPlanholds a shared physical plan and selected splits; constructing it performs no compilation.Blocked(Child)protocol.SourceReady::Activate,Source::activate, selection gates, and mutation of a running graph are removed.The comparison flag preserves the existing default path for matched off/on benchmarks. It has not been enabled by default.
Local microbenchmarks ran sequentially on a 14-logical-CPU Apple Silicon Mac with
release_debug. Each query selects 100 lists; the benchmark excludes disk IO and Arrow conversion. Two alternating off/on rounds used 100 samples of 100 iterations in the same binary. Values are medians of round medians:The six-fixture full-Arrow comparison passed all 72 reference checks and completed 32 timing cases (three seeds, two alternating rounds, 64 queries per run, first eight discarded). Most cases were within 4%. Two regressions persisted in a follow-up with three alternating rounds, three seeds, and 128 queries per run: cached short clustered lists with 64 KiB chunks measured 0.178 → 0.193 ms (+8.1%); a large nested-list singleton with 64 KiB chunks and reopen measured 0.452 → 0.490 ms (+8.5%). Large nested uniform selections with 1 MiB chunks measured 11.063 → 11.190 ms. The earlier activation implementation's speedup on that case is not retained. Small-list uniform selections with 64 KiB chunks measured 0.918 → 0.919 ms.
Random-access benchmarking uses the existing standard suite. The custom ListLayout fixture generator, comparison script, scan example, and extra CI steps have been removed. The workflow has no changes relative to the PR base. Adding
action/bench-random-accessruns the original suite.A local branch comparison with the ListLayout override and
VORTEX_LIST_PIPELINEdisabled used identical standard nested-list data, Rust 1.98.0,release_debug, three alternating rounds, and five seconds per target. PR1107f53c34versus develop8c2534ea18:Develop's dependency updates are included in this branch comparison. The cleanup commit changes no benchmark runtime code. The complete local Vortex matrix finished: all four datasets, both patterns and open modes, plus legacy taxi cases (18 cases, three alternating rounds, three seconds per target). The same release binaries were used; the cleanup commit only removes benchmark helpers and CI steps. Positive percentages below are slower than develop.
Legacy taxi improved 6.9% cached and 9.8% with reopen. Clustered taxi regressed about 8%, and clustered nested structs regressed 8–12%. These repeated across the alternating rounds, so this PR is not regression-free. Other-format baselines and remote/S3 performance were not measured locally in this comparison; the requested standard CI suite includes the other formats.
Release benchmark builds and the measurements above completed. New unit regressions, linting, and formatting checks were not run locally.
Prior validation of the default implementation at
c4fa7818b: 692 layout and 79 scan library tests, all seven await-protocol tests, scoped all-target/all-feature clippy with-D warnings, and 200 real-file reference comparisons plus five malformed-selection checks.The default planner retains a previously measured approximately 9–10% regression versus the rebased pre-refactor control for a large nested-list singleton with 1 MiB chunks (0.241 → 0.264 ms on the earlier ARM host). IO measurements attributed that gap to batching and reduced read overlap. Its 32 MiB estimate covers in-flight decoded work, not retained output or coalesced encoded buffers; the full memory matrix has not been revalidated.
This remains a draft. Standard benchmark CI for
fe25a60931is pending.