perf(format): parallel cached decode and fewer copies on full reads
Same-moment A/B on a 64 MB f64 dataset: chunked+deflate 110 -> 69 ms, chunked 72 -> 60 ms, contiguous 56 -> 30 ms. - read_chunked_data_cached — the path the facade uses — decompressed chunks one at a time; only the uncached reader was parallel. Cache misses are now decoded in bounded batches (128), in parallel with the `parallel` feature. - Every chunk was pushed into the 16 MiB chunk cache, which a larger dataset just churns (insert, evict moments later). Chunks are cached only when the whole dataset fits (new ChunkCache::max_bytes). - Unfiltered chunks went file -> Vec -> aligned cache buffer -> output. They are copied straight from the file bytes. - The facade's typed reads convert a contiguous dataset straight from the borrowed file bytes instead of copying it into a Vec first. - The native little-endian fast paths allocated vec![0; n] and then overwrote it; they now fill an uninitialised buffer in one copy (native_le_to_vec). alloc_output requests zeroed memory from the allocator instead of reserving and filling. The unit test that expected unfiltered chunks to land in the decompressed cache now asserts the new design (index reused, cache not involved). Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
d668e45ab5
commit
0addf328bc
@@ -91,6 +91,27 @@ because the machine's speed drifted; compare the *vs full read* column.)
|
||||
| contiguous | one row | 0.02 MB | 0.03 | 576 | 0.000x |
|
||||
| contiguous | one column | 0.03 MB | 2.55 | 12 | 0.042x |
|
||||
|
||||
### After: parallel cached decode, fewer copies (full reads)
|
||||
|
||||
Full-read times, old and new binaries run alternately at the same moment (this
|
||||
machine's absolute speed drifts over a long session, so only same-moment
|
||||
comparisons mean anything):
|
||||
|
||||
| layout (64 MB `f64`) | before | after |
|
||||
|---|---:|---:|
|
||||
| chunked + deflate | 110 ms | 69 ms |
|
||||
| chunked | 72 ms | 60 ms |
|
||||
| contiguous | 56 ms | 30 ms |
|
||||
|
||||
What changed: the facade's cached read path decompressed chunks one at a time
|
||||
(only the uncached reader was parallel) and pushed every chunk through a 16 MiB
|
||||
cache that a 64 MB read simply churns; it now decodes cache misses in parallel
|
||||
batches and caches only datasets that fit. Unfiltered chunks are copied
|
||||
straight from the file bytes instead of via two intermediate buffers. A
|
||||
contiguous dataset is converted straight from the file bytes (one copy instead
|
||||
of two), and the native-endian conversions no longer zero a buffer they are
|
||||
about to overwrite.
|
||||
|
||||
## Search harness baseline (v2.3.0)
|
||||
|
||||
Produced by `cargo run --release -p clawhdf5-bench --bin search_harness -- --full`
|
||||
|
||||
Reference in New Issue
Block a user