Skip to content

bench: compare Vortex with single-threaded Hardwood reads - #618

Merged
dfa1 merged 1 commit into
mainfrom
bench/parquet-single-thread
Oct 30, 2026
Merged

dfa1 merged 1 commit into
mainfrom
bench/parquet-single-thread

Conversation

@dfa1

@dfa1 dfa1 commented Oct 30, 2026

Copy link
Copy Markdown
Owner

ParquetVsVortexReadBenchmark compared several cores against one: Hardwood decodes pages on a pool sized to the machine, while the Vortex reads scan on the calling thread. On an 18-core M5 Max the Parquet batch reads kept about 2.9 and 4.4 cores busy, spending 8.5 ms and 15.8 ms of CPU per scan against Vortex's 3.8 ms and 6.2 ms.

parquetReadSingleThread and parquetReadMultiColumnSingleThread run the same batch loops (now shared helpers) with HardwoodContext.create(1). The default variants stay, as Hardwood's out-of-the-box wall time.

3 forks × 5 × 5 s, ops/s:

default pool 1 thread Vortex Vortex vs 1 thread
1 col trip_distance 349.9 ± 1.5 224.5 ± 14.0 288.6 ± 8.8 1.29×
2 cols fare_amount, PULocationID 319.9 ± 3.3 135.2 ± 3.5 191.9 ± 6.4 1.42×

All six read methods return the same sums as a null-aware row oracle (10,827,308.40 and 546,062,826.76), so every side does the full work.

docs/explanation.md reports these numbers instead of "Vortex trails Parquet batch, 0.71×"; DocsConsistencyTest allowlists HardwoodContext, which the docs now cite. Benchmark and docs only, so no CHANGELOG entry.

🤖 Generated with Claude Code

https://claude.ai/code/session_011fRbYuxQ3bvrntYDhPY1oD

Hardwood decodes pages on a pool sized to the machine, while the Vortex
reads scan on the calling thread, so parquetRead and
parquetReadMultiColumn measured several cores against one. On an
18-core M5 Max they kept about 2.9 and 4.4 cores busy and spent 8.5 ms
and 15.8 ms of CPU per scan, against Vortex's 3.8 ms and 6.2 ms.

parquetReadSingleThread and parquetReadMultiColumnSingleThread run the
same batch loops (moved into shared helpers) with
HardwoodContext.create(1). The default variants stay, as Hardwood's
out-of-the-box wall time.

3 forks x 5 x 5 s, ops/s:

                         default pool    1 thread       Vortex
  1 col  trip_distance   349.9 +- 1.5    224.5 +- 14.0  288.6 +- 8.8   1.29x
  2 cols fare+PULoc      319.9 +- 3.3    135.2 +- 3.5   191.9 +- 6.4   1.42x

All six read methods return the same sums as a null-aware row oracle.
docs/explanation.md now reports these numbers instead of "Vortex trails
Parquet batch, 0.71x", and DocsConsistencyTest allowlists HardwoodContext,
which it cites.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011fRbYuxQ3bvrntYDhPY1oD
@dfa1
dfa1 merged commit 31e8990 into main Oct 30, 2026
6 checks passed
@dfa1
dfa1 deleted the bench/parquet-single-thread branch October 30, 2026 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant