Skip to content

perf(parquet): optimize DELTA_BINARY_PACKED skip & add scan_filtered#9769

Closed
sahuagin wants to merge 1 commit intoapache:mainfrom
sahuagin:delta-skip-scan-filtered-decoder
Closed

perf(parquet): optimize DELTA_BINARY_PACKED skip & add scan_filtered#9769
sahuagin wants to merge 1 commit intoapache:mainfrom
sahuagin:delta-skip-scan-filtered-decoder

Conversation

@sahuagin
Copy link
Copy Markdown
Contributor

@sahuagin sahuagin commented Apr 20, 2026

Two additions to DeltaBitPackDecoder:

  1. skip() optimization: bw=0 miniblocks use an O(1) multiply instead of decoding 32/64 values per miniblock. Terminal skips (discarding all remaining page values) avoid heap allocation and last_value tracking.

  2. Decoder::scan_filtered() — new provided method on the Decoder trait (default: decode everything, safe fallback for all encodings). DeltaBitPackDecoder overrides it to compute a conservative value range [lo, hi] per miniblock and skip non-matching miniblocks without decoding individual values.

Benchmarks vs upstream HEAD (arrow_reader bench):
bw=0 single-value skip: -21.6%
bw=0 increasing-value skip: -24.3%
mixed stepped skip: -3.9%

Wall-time scan_filtered on 1M-row DELTA file (monotone column):
full decode: 1.96ms -> scan_filtered: 470us (4.2x speedup)

…red()

Two additions to DeltaBitPackDecoder:

1. skip() optimization: bw=0 miniblocks use an O(1) multiply instead of
   decoding 32/64 values per miniblock. Terminal skips (discarding all
   remaining page values) avoid heap allocation and last_value tracking.

2. Decoder::scan_filtered() — new provided method on the Decoder trait
   (default: decode everything, safe fallback for all encodings).
   DeltaBitPackDecoder overrides it to compute a conservative value range
   [lo, hi] per miniblock and skip non-matching miniblocks without decoding
   individual values.

Benchmarks vs upstream HEAD (arrow_reader bench):
  bw=0 single-value skip:      -21.6%
  bw=0 increasing-value skip:  -24.3%
  mixed stepped skip:           -3.9%

Wall-time scan_filtered on 1M-row DELTA file (monotone column):
  full decode: 1.96ms -> scan_filtered: 470us (4.2x speedup)
@etseidl
Copy link
Copy Markdown
Contributor

etseidl commented Apr 20, 2026

Thanks for your submission @sahuagin. A quick look at this leads me to believe there are 3 PRs here. One to optimize a special skip case, one to optimize for the case of skipping to the end of a page, and one to introduce a new API (scan_filtered). Would you be willing to split this PR up accordingly? In particular, the diffs for the scan_filtered addition spill over into the other optimizations, making it difficult to see what is actually being changed.

Also, if possible, please add new issues as necessary and link to them in the PR description. This helps us greatly when generating release notes. The skip optimization could perhaps piggyback on #9476, but the terminal skip and scan_filtered would ideally have their own issues.

Finally, if any of this code has been generated by a LLM, please see https://arrow.apache.org/docs/dev/developers/overview.html#ai-generated-code as well as https://www.apache.org/legal/generative-tooling.html

Thanks again

@sahuagin
Copy link
Copy Markdown
Contributor Author

I've got some stuff split up and going to submit shortly; I have an "origin story" for my offering that, in my voice, is much more conversational and story driven. Would it be ok to put that in the first issue to help explain what is going on, or is a more clinical voice preferred in tickets?

@etseidl
Copy link
Copy Markdown
Contributor

etseidl commented Apr 21, 2026

I've got some stuff split up and going to submit shortly; I have an "origin story" for my offering that, in my voice, is much more conversational and story driven. Would it be ok to put that in the first issue to help explain what is going on, or is a more clinical voice preferred in tickets?

We don't grade your prose 😅. But if you have a roadmap for what you plan to do a single issue with milestones is fine. That gives others a chance to guide the direction early on in case there are hidden pitfalls. Thanks!

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 21, 2026

I agree with @etseidl that splitting into smaller PRs will maek it more likely that we'll be able to find the time to review this code carefully.

Also I agree that the voice of the PR description is not a key consideration 😆 -- mostly we need to be able to review and understand your proposed changes

Thank you for your contribution @sahuagin

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 21, 2026

run benchmarks arrow_reader

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4289658664-1684-r724h 6.12.55+ #1 SMP Sun Feb 1 08:59:41 UTC 2026 aarch64 GNU/Linux

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

Comparing delta-skip-scan-filtered-decoder (095ebfc) to de11d9c (merge-base) diff
BENCH_NAME=arrow_reader
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader
BENCH_FILTER=
Results will be posted here when complete


File an issue against this benchmark runner

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark completed (GKE) | trigger

Instance: c4a-highmem-16 (12 vCPU / 65 GiB)

CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  16
On-line CPU(s) list:                     0-15
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     16
Socket(s):                               -
Cluster(s):                              1
Stepping:                                r0p1
BogoMIPS:                                2000.00
Flags:                                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti
L1d cache:                               1 MiB (16 instances)
L1i cache:                               1 MiB (16 instances)
L2 cache:                                32 MiB (16 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-15
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; CSV2, BHB
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected
Details

group                                                                                                      delta-skip-scan-filtered-decoder       main
-----                                                                                                      --------------------------------       ----
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                           1.02   849.2±16.02µs        ? ?/sec    1.00    833.0±9.48µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                          1.01    951.2±7.59µs        ? ?/sec    1.00    944.6±4.99µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                            1.02   853.9±16.10µs        ? ?/sec    1.00    836.7±9.33µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, mandatory, no NULLs                                     1.01    277.7±0.24µs        ? ?/sec    1.00    276.3±0.19µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, half NULLs                                    1.00    384.4±0.73µs        ? ?/sec    1.01    386.8±0.72µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, no NULLs                                      1.00    281.6±0.17µs        ? ?/sec    1.00    280.5±0.23µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, mandatory, no NULLs                                          1.00    412.9±5.33µs        ? ?/sec    1.00    414.8±5.18µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, half NULLs                                         1.00    463.4±4.25µs        ? ?/sec    1.01    467.1±4.35µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, no NULLs                                           1.01    418.1±8.52µs        ? ?/sec    1.00    413.1±6.73µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, mandatory, no NULLs                                 1.01     79.9±0.04µs        ? ?/sec    1.00     79.4±0.09µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, half NULLs                                1.01    108.0±0.12µs        ? ?/sec    1.00    107.2±0.08µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, no NULLs                                  1.00     83.3±0.06µs        ? ?/sec    1.00     83.2±0.04µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs                                      1.01    146.6±0.60µs        ? ?/sec    1.00    145.8±0.69µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs, short string                        1.01    142.2±0.42µs        ? ?/sec    1.00    140.9±0.09µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, half NULLs                                     1.01    145.4±3.06µs        ? ?/sec    1.00    143.6±0.54µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, no NULLs                                       1.00    151.1±0.34µs        ? ?/sec    1.00    151.8±0.26µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs     1.09  1056.1±31.31µs        ? ?/sec    1.00    968.8±0.69µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, half NULLs    1.00    679.8±1.20µs        ? ?/sec    1.00    677.5±0.47µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, no NULLs      1.00   995.8±10.39µs        ? ?/sec    1.00   994.0±10.68µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                 1.00    191.3±0.36µs        ? ?/sec    1.01    193.5±0.29µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                1.01    307.7±0.58µs        ? ?/sec    1.00    305.1±0.44µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                  1.00    199.0±0.50µs        ? ?/sec    1.00    198.9±0.42µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, mandatory, no NULLs        1.00    135.1±0.15µs        ? ?/sec    1.00    135.0±0.51µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, half NULLs       1.00    188.0±0.17µs        ? ?/sec    1.01    189.5±0.17µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, no NULLs         1.00    137.8±0.16µs        ? ?/sec    1.01    139.0±1.29µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, mandatory, no NULLs                    1.00     61.3±0.04µs        ? ?/sec    1.01     61.7±0.27µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, half NULLs                   1.00    149.7±0.07µs        ? ?/sec    1.01    151.5±0.10µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, no NULLs                     1.00     63.7±0.04µs        ? ?/sec    1.02     65.1±0.21µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, mandatory, no NULLs                    1.00    806.6±0.58µs        ? ?/sec    1.00    807.5±0.68µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, half NULLs                   1.00    521.9±0.43µs        ? ?/sec    1.00    520.8±0.28µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, no NULLs                     1.00    811.1±0.90µs        ? ?/sec    1.00    813.2±0.57µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, mandatory, no NULLs                                1.01     31.6±0.06µs        ? ?/sec    1.00     31.4±0.11µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, half NULLs                               1.02    148.3±0.27µs        ? ?/sec    1.00    145.9±0.18µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, no NULLs                                 1.00     35.3±0.11µs        ? ?/sec    1.02     35.8±0.07µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, mandatory, no NULLs                     1.00     81.3±0.22µs        ? ?/sec    1.01     81.9±0.14µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, half NULLs                    1.00    134.2±0.11µs        ? ?/sec    1.01    134.8±0.11µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, no NULLs                      1.00     84.3±0.15µs        ? ?/sec    1.01     85.3±0.21µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, mandatory, no NULLs                                 1.00      6.8±0.03µs        ? ?/sec    1.00      6.8±0.03µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, half NULLs                                1.00     96.7±0.07µs        ? ?/sec    1.00     97.2±0.06µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, no NULLs                                  1.00     10.3±0.03µs        ? ?/sec    1.00     10.4±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, mandatory, no NULLs                     1.00    159.8±0.32µs        ? ?/sec    1.00    159.8±0.26µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, half NULLs                    1.00    207.5±0.16µs        ? ?/sec    1.00    207.4±0.16µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, no NULLs                      1.00    162.6±0.22µs        ? ?/sec    1.00    162.3±0.21µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, mandatory, no NULLs                                 1.01      9.7±0.03µs        ? ?/sec    1.00      9.6±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, half NULLs                                1.00    132.4±0.08µs        ? ?/sec    1.00    132.3±0.08µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, no NULLs                                  1.00     13.2±0.03µs        ? ?/sec    1.00     13.3±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, mandatory, no NULLs                     1.00    319.2±0.41µs        ? ?/sec    1.01    322.6±0.35µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, half NULLs                    1.00    283.4±0.30µs        ? ?/sec    1.00    282.4±0.37µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, no NULLs                      1.00    323.3±0.32µs        ? ?/sec    1.00    324.2±0.42µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, mandatory, no NULLs                                 1.00     16.2±0.04µs        ? ?/sec    1.00     16.1±1.33µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, half NULLs                                1.01    132.6±0.18µs        ? ?/sec    1.00    131.6±0.13µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, no NULLs                                  1.03     20.4±0.03µs        ? ?/sec    1.00     19.7±0.02µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed increasing value                                    1.01     87.1±0.30µs        ? ?/sec    1.00     86.6±0.57µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed single value                                        1.00     78.5±0.19µs        ? ?/sec    1.00     78.7±0.28µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip increasing value                               1.00     50.4±0.18µs        ? ?/sec    1.13     57.1±0.40µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip single value                                   1.00     46.0±0.10µs        ? ?/sec    1.07     49.4±0.21µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip stepped increasing value                       1.00     73.3±0.09µs        ? ?/sec    1.00     73.1±0.07µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.00     88.5±0.12µs        ? ?/sec    1.00     88.4±0.14µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, half NULLs                          1.00     89.8±0.14µs        ? ?/sec    1.00     89.4±0.15µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, no NULLs                            1.00     90.5±0.14µs        ? ?/sec    1.00     90.4±0.16µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed stepped increasing value                            1.00    105.7±0.19µs        ? ?/sec    1.01    106.8±0.96µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, mandatory, no NULLs                                1.00    124.3±0.30µs        ? ?/sec    1.00    124.3±0.33µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, half NULLs                               1.00    147.1±0.23µs        ? ?/sec    1.00    147.3±0.26µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, no NULLs                                 1.00    128.2±0.20µs        ? ?/sec    1.00    128.7±0.20µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.00     53.8±0.06µs        ? ?/sec    1.00     53.8±0.08µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.00    111.1±0.35µs        ? ?/sec    1.00    110.6±0.15µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     57.7±0.28µs        ? ?/sec    1.00     57.5±0.04µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00     83.9±0.07µs        ? ?/sec    1.00     84.1±0.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, half NULLs                          1.00    128.0±0.20µs        ? ?/sec    1.00    127.9±0.15µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00     87.6±0.07µs        ? ?/sec    1.00     87.4±0.06µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, mandatory, no NULLs                                1.03     48.5±0.05µs        ? ?/sec    1.00     46.9±0.07µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, half NULLs                               1.01    108.5±0.21µs        ? ?/sec    1.00    107.6±0.13µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, no NULLs                                 1.00     50.6±0.25µs        ? ?/sec    1.00     50.5±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed increasing value                                    1.00     77.5±0.09µs        ? ?/sec    1.00     77.3±0.20µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed single value                                        1.01     74.4±0.11µs        ? ?/sec    1.00     73.8±0.23µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip increasing value                               1.00     43.5±0.07µs        ? ?/sec    1.15     49.8±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip single value                                   1.00     41.4±0.07µs        ? ?/sec    1.08     44.8±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip stepped increasing value                       1.00     67.0±0.08µs        ? ?/sec    1.01     67.6±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.01     79.5±0.08µs        ? ?/sec    1.00     78.6±0.09µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, half NULLs                          1.01     90.8±0.09µs        ? ?/sec    1.00     89.8±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, no NULLs                            1.01     81.4±0.08µs        ? ?/sec    1.00     80.9±0.11µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed stepped increasing value                            1.00     98.9±0.12µs        ? ?/sec    1.02    101.1±1.20µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, mandatory, no NULLs                                1.01    114.8±0.17µs        ? ?/sec    1.00    113.9±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, half NULLs                               1.01    153.4±0.12µs        ? ?/sec    1.00    151.5±0.12µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, no NULLs                                 1.01    118.6±0.11µs        ? ?/sec    1.00    117.8±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.01     83.2±0.45µs        ? ?/sec    1.00     82.8±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.01    136.9±0.13µs        ? ?/sec    1.00    135.6±0.12µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     87.8±0.08µs        ? ?/sec    1.00     87.5±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00     86.2±0.07µs        ? ?/sec    1.00     86.2±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, half NULLs                          1.00    139.9±0.09µs        ? ?/sec    1.00    139.3±0.12µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00     90.1±0.07µs        ? ?/sec    1.00     90.0±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, mandatory, no NULLs                                1.00     53.9±0.06µs        ? ?/sec    1.00     54.1±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, half NULLs                               1.01    121.7±0.12µs        ? ?/sec    1.00    120.7±0.09µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, no NULLs                                 1.00     58.2±0.06µs        ? ?/sec    1.00     58.4±0.09µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed increasing value                                               1.00     52.6±0.33µs        ? ?/sec    1.00     52.4±0.39µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed single value                                                   1.00     44.2±0.31µs        ? ?/sec    1.00     44.2±0.46µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip increasing value                                          1.00     32.8±0.21µs        ? ?/sec    1.21     39.8±0.30µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip single value                                              1.00     28.2±0.19µs        ? ?/sec    1.12     31.7±0.31µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip stepped increasing value                                  1.00     56.1±0.09µs        ? ?/sec    1.00     56.3±0.07µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, mandatory, no NULLs                                      1.00     71.6±0.12µs        ? ?/sec    1.00     71.5±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, half NULLs                                     1.00     72.6±0.10µs        ? ?/sec    1.00     72.4±0.13µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, no NULLs                                       1.01     74.3±0.13µs        ? ?/sec    1.00     73.3±0.16µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed stepped increasing value                                       1.00     72.6±0.17µs        ? ?/sec    1.00     73.0±0.13µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, mandatory, no NULLs                                           1.00     91.2±0.22µs        ? ?/sec    1.00     91.5±0.18µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, half NULLs                                          1.00    114.0±0.20µs        ? ?/sec    1.00    113.6±0.21µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, no NULLs                                            1.00     95.1±0.26µs        ? ?/sec    1.00     95.1±0.19µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     21.0±0.06µs        ? ?/sec    1.00     20.9±0.03µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, half NULLs                              1.00     77.4±0.15µs        ? ?/sec    1.00     77.2±0.17µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, no NULLs                                1.01     24.6±0.06µs        ? ?/sec    1.00     24.5±0.03µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, mandatory, no NULLs                                      1.00     50.6±0.05µs        ? ?/sec    1.01     51.1±0.03µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, half NULLs                                     1.00     95.3±0.14µs        ? ?/sec    1.00     94.8±0.21µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, no NULLs                                       1.00     54.3±0.06µs        ? ?/sec    1.01     55.0±0.06µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, mandatory, no NULLs                                           1.01     14.0±0.05µs        ? ?/sec    1.00     13.8±0.02µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, half NULLs                                          1.01     75.0±0.14µs        ? ?/sec    1.00     74.1±0.19µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, no NULLs                                            1.02     17.9±0.07µs        ? ?/sec    1.00     17.5±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed increasing value                                               1.00     48.9±0.45µs        ? ?/sec    1.02     49.9±0.55µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed single value                                                   1.00     41.1±0.51µs        ? ?/sec    1.01     41.3±0.24µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip increasing value                                          1.00     30.9±0.22µs        ? ?/sec    1.24     38.2±0.38µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip single value                                              1.00     26.6±0.23µs        ? ?/sec    1.14     30.2±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip stepped increasing value                                  1.00     54.5±0.05µs        ? ?/sec    1.00     54.4±0.08µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, mandatory, no NULLs                                      1.00     69.6±0.20µs        ? ?/sec    1.00     69.6±0.21µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, half NULLs                                     1.01     71.7±0.08µs        ? ?/sec    1.00     71.2±0.11µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, no NULLs                                       1.00     71.8±0.21µs        ? ?/sec    1.00     71.8±0.16µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed stepped increasing value                                       1.00     69.1±0.13µs        ? ?/sec    1.00     69.3±0.11µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, mandatory, no NULLs                                           1.00     87.6±0.35µs        ? ?/sec    1.00     87.9±0.18µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, half NULLs                                          1.00    110.6±0.16µs        ? ?/sec    1.01    111.2±0.19µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, no NULLs                                            1.00     91.9±0.38µs        ? ?/sec    1.00     91.8±0.16µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     17.4±0.05µs        ? ?/sec    1.00     17.3±0.01µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, half NULLs                              1.00     74.3±0.12µs        ? ?/sec    1.00     74.6±0.10µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, no NULLs                                1.01     21.1±0.05µs        ? ?/sec    1.00     20.9±0.02µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, mandatory, no NULLs                                      1.00     47.4±0.05µs        ? ?/sec    1.00     47.4±0.05µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, half NULLs                                     1.00     91.2±0.14µs        ? ?/sec    1.01     91.9±0.13µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, no NULLs                                       1.00     51.2±0.09µs        ? ?/sec    1.00     51.2±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, mandatory, no NULLs                                           1.01     10.0±0.07µs        ? ?/sec    1.00      9.9±0.01µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, half NULLs                                          1.00     71.6±0.11µs        ? ?/sec    1.00     71.8±0.09µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, no NULLs                                            1.00     13.7±0.08µs        ? ?/sec    1.00     13.6±0.04µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed increasing value                                               1.01     40.7±0.15µs        ? ?/sec    1.00     40.3±0.14µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed single value                                                   1.01     37.8±0.18µs        ? ?/sec    1.00     37.4±0.20µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip increasing value                                          1.00     24.4±0.07µs        ? ?/sec    1.27     30.9±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip single value                                              1.00     22.8±0.08µs        ? ?/sec    1.14     26.1±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip stepped increasing value                                  1.00     48.0±0.06µs        ? ?/sec    1.01     48.7±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, mandatory, no NULLs                                      1.01     60.6±0.09µs        ? ?/sec    1.00     59.8±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, half NULLs                                     1.01     71.9±0.09µs        ? ?/sec    1.00     71.0±0.07µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, no NULLs                                       1.01     62.6±0.10µs        ? ?/sec    1.00     62.2±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed stepped increasing value                                       1.00     62.1±0.16µs        ? ?/sec    1.02     63.4±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, mandatory, no NULLs                                           1.01     77.8±0.17µs        ? ?/sec    1.00     77.0±0.15µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, half NULLs                                          1.02    116.6±0.16µs        ? ?/sec    1.00    114.8±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, no NULLs                                            1.01     81.9±0.15µs        ? ?/sec    1.00     80.9±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     46.2±0.07µs        ? ?/sec    1.00     46.4±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, half NULLs                              1.01     99.9±0.13µs        ? ?/sec    1.00     99.1±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, no NULLs                                1.01     50.8±0.07µs        ? ?/sec    1.00     50.6±0.04µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, mandatory, no NULLs                                      1.00     49.6±0.06µs        ? ?/sec    1.00     49.7±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, half NULLs                                     1.01    102.6±0.10µs        ? ?/sec    1.00    101.9±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, no NULLs                                       1.00     53.3±0.07µs        ? ?/sec    1.00     53.1±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, mandatory, no NULLs                                           1.00     16.5±0.06µs        ? ?/sec    1.01     16.7±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, half NULLs                                          1.01     85.4±0.12µs        ? ?/sec    1.00     84.5±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, no NULLs                                            1.00     20.1±0.06µs        ? ?/sec    1.02     20.5±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed increasing value                                                1.00     52.0±0.44µs        ? ?/sec    1.01     52.3±0.36µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed single value                                                    1.00     43.9±0.66µs        ? ?/sec    1.00     43.8±0.41µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip increasing value                                           1.00     32.5±0.26µs        ? ?/sec    1.21     39.4±0.31µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip single value                                               1.00     28.1±0.32µs        ? ?/sec    1.13     31.6±0.29µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip stepped increasing value                                   1.00     56.2±0.09µs        ? ?/sec    1.00     56.2±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, mandatory, no NULLs                                       1.00     71.5±0.16µs        ? ?/sec    1.00     71.2±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, half NULLs                                      1.01     72.9±0.10µs        ? ?/sec    1.00     72.3±0.10µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, no NULLs                                        1.00     73.7±0.14µs        ? ?/sec    1.00     73.4±0.07µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed stepped increasing value                                        1.00     72.6±0.15µs        ? ?/sec    1.01     73.0±0.13µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, mandatory, no NULLs                                            1.00     91.6±0.07µs        ? ?/sec    1.00     91.5±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, half NULLs                                           1.01    114.5±0.21µs        ? ?/sec    1.00    113.4±0.15µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, no NULLs                                             1.00     95.6±0.26µs        ? ?/sec    1.00     95.2±0.13µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, mandatory, no NULLs                                1.00     20.7±0.07µs        ? ?/sec    1.01     20.8±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, half NULLs                               1.01     77.4±0.12µs        ? ?/sec    1.00     77.0±0.13µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, no NULLs                                 1.00     24.4±0.06µs        ? ?/sec    1.01     24.7±0.07µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, mandatory, no NULLs                                       1.00     50.7±0.07µs        ? ?/sec    1.00     50.9±0.03µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, half NULLs                                      1.00     95.2±0.13µs        ? ?/sec    1.00     94.8±0.15µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, no NULLs                                        1.00     54.3±0.07µs        ? ?/sec    1.01     54.7±0.03µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, mandatory, no NULLs                                            1.01     13.7±0.04µs        ? ?/sec    1.00     13.5±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, half NULLs                                           1.01     75.1±0.19µs        ? ?/sec    1.00     74.7±0.12µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, no NULLs                                             1.00     17.4±0.07µs        ? ?/sec    1.00     17.5±0.03µs        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings half NULLs                                     1.00      3.9±0.01ms        ? ?/sec    1.00      3.9±0.01ms        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings no NULLs                                       1.00      7.0±0.03ms        ? ?/sec    1.00      7.0±0.03ms        ? ?/sec
arrow_array_reader/StringArray/const delta byte array encoded, mandatory, no NULLs                         1.00    532.3±2.67µs        ? ?/sec    1.03    547.0±6.78µs        ? ?/sec
arrow_array_reader/StringArray/const delta length byte array encoded, mandatory, no NULLs                  1.00    208.5±0.31µs        ? ?/sec    1.03    215.8±0.74µs        ? ?/sec
arrow_array_reader/StringArray/const prefix delta byte array encoded, mandatory, no NULLs                  1.00   746.5±47.21µs        ? ?/sec    1.05   781.1±36.49µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, mandatory, no NULLs                                     1.00    265.0±0.18µs        ? ?/sec    1.04    276.2±0.17µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, half NULLs                                    1.00    383.6±1.29µs        ? ?/sec    1.01    386.7±0.84µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, no NULLs                                      1.00    270.1±0.15µs        ? ?/sec    1.04    280.7±0.26µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, mandatory, no NULLs                                          1.02    457.2±8.15µs        ? ?/sec    1.00    448.8±6.62µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, half NULLs                                         1.00    483.6±4.64µs        ? ?/sec    1.02    493.5±3.99µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, no NULLs                                           1.02    462.9±7.45µs        ? ?/sec    1.00    455.5±6.72µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, mandatory, no NULLs                                1.07    274.4±0.47µs        ? ?/sec    1.00    256.2±0.82µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, half NULLs                               1.03    291.5±0.46µs        ? ?/sec    1.00    283.8±1.63µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, no NULLs                                 1.07    278.2±0.56µs        ? ?/sec    1.00    260.5±0.87µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, mandatory, no NULLs                                 1.01     80.0±0.06µs        ? ?/sec    1.00     79.5±0.05µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, half NULLs                                1.01    108.4±0.10µs        ? ?/sec    1.00    107.7±0.09µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, no NULLs                                  1.00     83.5±0.08µs        ? ?/sec    1.00     83.6±0.07µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, mandatory, no NULLs                                      1.00    218.5±0.37µs        ? ?/sec    1.00    218.6±0.42µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, half NULLs                                     1.00    180.3±0.25µs        ? ?/sec    1.01    181.3±0.33µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, no NULLs                                       1.00    225.7±0.35µs        ? ?/sec    1.00    226.3±0.44µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed increasing value                                              1.01     52.7±0.37µs        ? ?/sec    1.00     52.4±0.41µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed single value                                                  1.01     44.5±0.31µs        ? ?/sec    1.00     43.9±0.44µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip increasing value                                         1.00     33.0±0.26µs        ? ?/sec    1.21     40.0±0.25µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip single value                                             1.00     28.3±0.21µs        ? ?/sec    1.12     31.6±0.32µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip stepped increasing value                                 1.00     56.2±0.10µs        ? ?/sec    1.00     56.3±0.07µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, mandatory, no NULLs                                     1.01     76.1±0.08µs        ? ?/sec    1.00     75.5±0.10µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, half NULLs                                    1.00     75.2±0.10µs        ? ?/sec    1.00     75.2±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, no NULLs                                      1.01     78.2±0.11µs        ? ?/sec    1.00     77.8±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed stepped increasing value                                      1.00     72.8±0.18µs        ? ?/sec    1.00     73.1±0.13µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, mandatory, no NULLs                                          1.00     97.1±0.22µs        ? ?/sec    1.00     97.2±0.17µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, half NULLs                                         1.00    117.7±0.15µs        ? ?/sec    1.00    117.4±0.19µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, no NULLs                                           1.01    101.5±0.21µs        ? ?/sec    1.00    101.0±0.13µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     21.0±0.06µs        ? ?/sec    1.00     21.0±0.02µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, half NULLs                             1.00     77.5±0.14µs        ? ?/sec    1.00     77.2±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, no NULLs                               1.00     24.5±0.05µs        ? ?/sec    1.00     24.5±0.03µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, mandatory, no NULLs                                     1.00     51.0±0.05µs        ? ?/sec    1.00     50.9±0.03µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, half NULLs                                    1.00     95.1±0.21µs        ? ?/sec    1.00     95.0±0.19µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, no NULLs                                      1.00     54.5±0.07µs        ? ?/sec    1.00     54.7±0.06µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, mandatory, no NULLs                                          1.01     13.9±0.05µs        ? ?/sec    1.00     13.7±0.03µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, half NULLs                                         1.01     75.1±0.15µs        ? ?/sec    1.00     74.2±0.12µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, no NULLs                                           1.03     17.8±0.08µs        ? ?/sec    1.00     17.3±0.05µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed increasing value                                              1.01     49.4±0.36µs        ? ?/sec    1.00     49.0±0.35µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed single value                                                  1.01     41.0±0.30µs        ? ?/sec    1.00     40.7±0.44µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip increasing value                                         1.00     31.1±0.20µs        ? ?/sec    1.22     38.0±0.24µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip single value                                             1.00     26.5±0.20µs        ? ?/sec    1.13     30.1±0.27µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip stepped increasing value                                 1.00     54.7±0.08µs        ? ?/sec    1.00     54.4±0.09µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, mandatory, no NULLs                                     1.00     69.9±0.21µs        ? ?/sec    1.00     69.7±0.23µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, half NULLs                                    1.00     71.0±0.39µs        ? ?/sec    1.00     70.7±0.15µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, no NULLs                                      1.00     71.8±0.23µs        ? ?/sec    1.00     71.8±0.22µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed stepped increasing value                                      1.00     69.1±0.15µs        ? ?/sec    1.01     69.5±0.13µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, mandatory, no NULLs                                          1.00     87.7±0.38µs        ? ?/sec    1.00     87.7±0.33µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, half NULLs                                         1.00    110.7±0.18µs        ? ?/sec    1.00    110.8±0.28µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, no NULLs                                           1.00     91.8±0.39µs        ? ?/sec    1.00     91.7±0.35µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, mandatory, no NULLs                              1.01     17.6±0.07µs        ? ?/sec    1.00     17.5±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, half NULLs                             1.00     74.3±0.13µs        ? ?/sec    1.01     75.1±0.13µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, no NULLs                               1.00     21.0±0.05µs        ? ?/sec    1.00     21.1±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, mandatory, no NULLs                                     1.00     47.6±0.06µs        ? ?/sec    1.00     47.6±0.06µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, half NULLs                                    1.00     91.6±0.14µs        ? ?/sec    1.00     91.9±0.15µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, no NULLs                                      1.00     51.2±0.07µs        ? ?/sec    1.00     51.4±0.06µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, mandatory, no NULLs                                          1.01     10.2±0.05µs        ? ?/sec    1.00     10.0±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, half NULLs                                         1.01     72.2±0.14µs        ? ?/sec    1.00     71.7±0.18µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, no NULLs                                           1.00     13.7±0.06µs        ? ?/sec    1.02     13.9±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed increasing value                                              1.01     41.1±0.11µs        ? ?/sec    1.00     40.7±0.18µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed single value                                                  1.02     38.0±0.15µs        ? ?/sec    1.00     37.4±0.20µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip increasing value                                         1.00     24.4±0.07µs        ? ?/sec    1.28     31.1±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip single value                                             1.00     22.9±0.07µs        ? ?/sec    1.16     26.5±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip stepped increasing value                                 1.00     48.0±0.08µs        ? ?/sec    1.01     48.6±0.05µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, mandatory, no NULLs                                     1.01     60.7±0.11µs        ? ?/sec    1.00     60.1±0.10µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, half NULLs                                    1.01     72.1±0.21µs        ? ?/sec    1.00     71.1±0.07µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, no NULLs                                      1.01     62.5±0.09µs        ? ?/sec    1.00     62.1±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed stepped increasing value                                      1.00     62.2±0.13µs        ? ?/sec    1.02     63.5±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, mandatory, no NULLs                                          1.01     77.8±0.16µs        ? ?/sec    1.00     77.3±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, half NULLs                                         1.01    116.2±0.11µs        ? ?/sec    1.00    115.1±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, no NULLs                                           1.01     82.0±0.14µs        ? ?/sec    1.00     81.1±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     46.3±0.05µs        ? ?/sec    1.01     46.6±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, half NULLs                             1.01    100.0±0.08µs        ? ?/sec    1.00     99.4±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, no NULLs                               1.00     50.8±0.07µs        ? ?/sec    1.00     50.6±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, mandatory, no NULLs                                     1.00     49.6±0.05µs        ? ?/sec    1.03     51.1±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, half NULLs                                    1.00    103.0±0.09µs        ? ?/sec    1.00    102.7±0.14µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, no NULLs                                      1.00     53.3±0.05µs        ? ?/sec    1.00     53.1±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, mandatory, no NULLs                                          1.01     16.8±0.06µs        ? ?/sec    1.00     16.6±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, half NULLs                                         1.01     85.2±0.09µs        ? ?/sec    1.00     84.8±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, no NULLs                                           1.02     20.4±0.05µs        ? ?/sec    1.00     20.0±0.02µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed increasing value                                               1.00     52.1±0.49µs        ? ?/sec    1.03     53.6±0.34µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed single value                                                   1.00     44.0±0.63µs        ? ?/sec    1.02     44.7±0.19µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip increasing value                                          1.00     32.6±0.28µs        ? ?/sec    1.23     40.3±0.26µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip single value                                              1.00     28.1±0.32µs        ? ?/sec    1.14     32.1±0.13µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip stepped increasing value                                  1.00     56.2±0.08µs        ? ?/sec    1.00     56.1±0.08µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, mandatory, no NULLs                                      1.02     75.7±0.08µs        ? ?/sec    1.00     74.5±0.06µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, half NULLs                                     1.00     74.7±0.10µs        ? ?/sec    1.00     74.3±0.34µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, no NULLs                                       1.01     77.9±0.13µs        ? ?/sec    1.00     76.9±0.28µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed stepped increasing value                                       1.00     72.5±0.14µs        ? ?/sec    1.00     72.8±0.14µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, mandatory, no NULLs                                           1.01     97.0±0.26µs        ? ?/sec    1.00     95.7±0.10µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, half NULLs                                          1.01    117.3±0.41µs        ? ?/sec    1.00    116.6±0.18µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, no NULLs                                            1.01    101.0±0.18µs        ? ?/sec    1.00     99.6±0.08µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     20.7±0.06µs        ? ?/sec    1.00     20.8±0.04µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, half NULLs                              1.00     77.2±0.18µs        ? ?/sec    1.00     76.8±0.13µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, no NULLs                                1.00     24.4±0.05µs        ? ?/sec    1.01     24.6±0.04µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, mandatory, no NULLs                                      1.00     50.6±0.05µs        ? ?/sec    1.01     50.9±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, half NULLs                                     1.00     94.7±0.16µs        ? ?/sec    1.01     95.3±0.18µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, no NULLs                                       1.00     54.4±0.08µs        ? ?/sec    1.00     54.3±0.04µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, mandatory, no NULLs                                           1.00     13.7±0.06µs        ? ?/sec    1.00     13.6±0.04µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, half NULLs                                          1.00     74.1±0.15µs        ? ?/sec    1.03     76.0±0.09µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, no NULLs                                            1.03     17.7±0.08µs        ? ?/sec    1.00     17.2±0.02µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, half NULLs            1.00     72.0±0.12µs        ? ?/sec    1.00     72.2±0.08µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, no NULLs              1.00     13.9±0.04µs        ? ?/sec    1.01     14.0±0.02µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, half NULLs             1.00    131.8±0.11µs        ? ?/sec    1.00    132.3±0.19µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, no NULLs               1.00     65.0±0.04µs        ? ?/sec    1.01     65.5±0.04µs        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 2815.6s
Peak memory 3.9 GiB
Avg memory 3.9 GiB
CPU user 2813.8s
CPU sys 1.2s
Peak spill 0 B

branch

Metric Value
Wall time 2825.6s
Peak memory 3.9 GiB
Avg memory 3.9 GiB
CPU user 2821.9s
CPU sys 0.5s
Peak spill 0 B

File an issue against this benchmark runner

Copy link
Copy Markdown
Contributor

@etseidl etseidl left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just flushing some comments on the optimization. The speed up looks nice for the special cases. I'm not sure the terminal skip is showing up, but I think that case can be optimized further (local testing showed a maybe 4% improvement in the other skip cases).

// Terminal skip: caller is discarding all remaining values on this page.
// last_value will never be read again, so we can use O(1) arithmetic
// skips (BitReader::skip) instead of decoding through get_batch.
let terminal = to_skip >= self.values_left + skip;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all of the "terminal" logic can move before taking first_value. If terminal is true, we don't even need to take first_value.

let terminal = to_skip >= self.values_left + skip;

if terminal {
while skip < to_skip {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this can simply set self.values_left to 0, and perhaps take first_value just in case. The only reason for stepping through the headers is to do validation, but if we're skipping anyway, I think we can just ignore invalid data.

));
}

// see commentary in self.get() above regarding optimizations
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure why this comment was dropped, please restore

if bit_width == 0 {
// if min_delta == 0, there's nothing to do. self.last_value is unchanged
// All remainders are zero: every delta equals min_delta exactly.
// Advance last_value by n * min_delta with no bit reads.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new comments here do not address the min_delta == 0 case.

@sahuagin
Copy link
Copy Markdown
Contributor Author

Superseded by three focused PRs as requested: #9786 (bw=0 skip), #9787 (terminal skip), #9788 (scan_filtered). Issues: #9783, #9784, #9785.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

parquet Changes to the parquet crate performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants