Skip to content

parquet: O(1) skip for bw=0 miniblocks in DeltaBitPackDecoder#9786

Merged
alamb merged 4 commits intoapache:mainfrom
sahuagin:pr/bw0-skip
Apr 22, 2026
Merged

parquet: O(1) skip for bw=0 miniblocks in DeltaBitPackDecoder#9786
alamb merged 4 commits intoapache:mainfrom
sahuagin:pr/bw0-skip

Conversation

@sahuagin
Copy link
Copy Markdown
Contributor

@sahuagin sahuagin commented Apr 21, 2026

In the non-terminal skip path of DeltaBitPackDecoder::skip(), miniblocks with
bit_width=0 no longer call get_batch. Every delta in a bw=0 miniblock equals
min_delta exactly, so last_value can be advanced by n * min_delta using a
single wrapping_mul + wrapping_add. When min_delta == 0 no update is
needed at all.

Benchmarks (arrow_reader bench vs upstream HEAD, -- skip --baseline upstream):

Int32 skip single value:            -23.7%
Int32 skip increasing value:        -16.5%
Int32 skip mandatory, no NULLs:     -4.1%
Int64 skip single value:            -25.9%
Int64 skip increasing value:        -21.0%

Results are consistent across all integer types (Int8/16/32/64, UInt8/16/32/64,
Decimal128). Benchmarks were run on a non-isolated machine (no CPU frequency
pinning); small variances of ±5% on non-bw=0 paths should be attributed to
measurement noise.

Origin: Observed that constant and near-constant integer columns encoded
with DELTA_BINARY_PACKED are common in practice (timestamps with uniform step,
run-length-like data). The bw=0 case is the hot path for those columns and the
decode loop was doing unnecessary work.

Verification: Existing skip tests pass. Two new focused tests added for the
uniform-step case (min_delta != 0), which was not covered by prior tests.
The bw=0 path produces identical last_value state as the decode-based path by
construction (n * min_delta == sum of n copies of min_delta).

Generated-by: Claude (claude-sonnet-4-6)

In the non-terminal skip path, miniblocks with bit_width=0 no longer call
get_batch. Every delta in a bw=0 miniblock equals min_delta exactly, so
last_value can be advanced by n * min_delta using a single wrapping_mul +
wrapping_add. When min_delta == 0 no update is needed at all.

Common in practice: timestamps with uniform step, run-length-like data.
The bw=0 case is the hot path for those columns.

Benchmarks vs upstream HEAD:
  bw=0 single-value skip:     -21.6%
  bw=0 increasing-value skip: -24.3%

Split from apache#9769 as requested by reviewer.
@sahuagin sahuagin marked this pull request as draft April 21, 2026 19:09
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.

Thanks @sahuagin, I think this is great. Just a few comment nits.

));
}

// 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.

Please restore this comment as it is still relevant

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Will do as soon as possible.

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.

please still address the min_delta == 0 case in the comments here

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Will do. I think you have more info in my prior ticket, which I'll incorporate.

let mini_block_to_skip = self.mini_block_remaining.min(to_skip - skip);
let mini_block_should_skip = mini_block_to_skip;

let skip_count = self
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 love moving this inside bw != 0 branch...saves a memset at least. I wonder if we could lazy initialize skip_buffer as well. Probably better as a follow on.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Should I make a ticket for this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Filed as #9792 for follow-on — thanks for the suggestion.

@etseidl
Copy link
Copy Markdown
Contributor

etseidl commented Apr 21, 2026

run benchmark arrow_reader

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4291253057-1706-zcffg 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 pr/bw0-skip (cb208e5) 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                                                                                                      main                                   pr_bw0-skip
-----                                                                                                      ----                                   -----------
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                           1.00    833.3±9.83µs        ? ?/sec    1.00    834.8±9.13µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                          1.00    945.8±4.53µs        ? ?/sec    1.00    944.5±4.16µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                            1.00   840.9±19.10µs        ? ?/sec    1.00    836.9±9.24µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, mandatory, no NULLs                                     1.00    283.5±0.29µs        ? ?/sec    1.00    284.1±0.76µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, half NULLs                                    1.00    389.7±1.50µs        ? ?/sec    1.00    388.9±0.83µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, no NULLs                                      1.00    287.3±0.27µs        ? ?/sec    1.00    287.5±0.42µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, mandatory, no NULLs                                          1.00    404.2±7.02µs        ? ?/sec    1.05    424.3±5.06µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, half NULLs                                         1.00    463.0±2.09µs        ? ?/sec    1.00    465.2±3.74µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, no NULLs                                           1.01    410.4±6.14µs        ? ?/sec    1.00    408.2±4.76µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, mandatory, no NULLs                                 1.00     79.7±0.08µs        ? ?/sec    1.00     79.5±0.06µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, half NULLs                                1.00    107.9±0.30µs        ? ?/sec    1.00    108.0±0.09µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, no NULLs                                  1.00     83.4±0.07µs        ? ?/sec    1.00     83.2±0.16µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs                                      1.00    150.0±3.45µs        ? ?/sec    1.01    150.9±2.75µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs, short string                        1.00    142.5±0.30µs        ? ?/sec    1.01    144.0±2.79µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, half NULLs                                     1.00    145.2±0.79µs        ? ?/sec    1.01    146.1±0.74µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, no NULLs                                       1.05    161.1±1.96µs        ? ?/sec    1.00    153.5±4.46µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs     1.08  1087.3±41.91µs        ? ?/sec    1.00  1003.5±47.70µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, half NULLs    1.00    678.7±0.74µs        ? ?/sec    1.00    677.8±0.68µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, no NULLs      1.00    975.1±1.53µs        ? ?/sec    1.00    974.1±1.00µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                 1.00    195.1±1.20µs        ? ?/sec    1.00    194.2±0.76µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                1.01    308.0±0.67µs        ? ?/sec    1.00    305.5±0.49µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                  1.00    198.1±0.62µs        ? ?/sec    1.00    198.9±0.66µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, mandatory, no NULLs        1.00    135.0±0.27µs        ? ?/sec    1.03    139.1±0.46µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, half NULLs       1.01    189.9±1.30µs        ? ?/sec    1.00    187.1±0.18µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, no NULLs         1.00    140.1±1.29µs        ? ?/sec    1.00    139.6±1.90µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, mandatory, no NULLs                    1.00     62.1±0.09µs        ? ?/sec    1.00     61.8±0.04µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, half NULLs                   1.07    158.3±0.67µs        ? ?/sec    1.00    148.4±0.21µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, no NULLs                     1.01     65.0±0.13µs        ? ?/sec    1.00     64.3±0.05µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, mandatory, no NULLs                    1.00    807.7±0.73µs        ? ?/sec    1.00    807.1±2.16µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, half NULLs                   1.01    524.1±0.70µs        ? ?/sec    1.00    520.0±1.41µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, no NULLs                     1.00    815.0±0.86µs        ? ?/sec    1.00    812.7±1.05µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, mandatory, no NULLs                                1.01     31.0±0.06µs        ? ?/sec    1.00     30.8±0.09µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, half NULLs                               1.00    146.0±0.28µs        ? ?/sec    1.00    145.5±0.33µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, no NULLs                                 1.00     35.5±0.11µs        ? ?/sec    1.00     35.4±0.11µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, mandatory, no NULLs                     1.00     81.5±0.16µs        ? ?/sec    1.00     81.8±0.20µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, half NULLs                    1.01    134.8±0.11µs        ? ?/sec    1.00    133.5±0.28µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, no NULLs                      1.00     84.5±0.18µs        ? ?/sec    1.00     84.5±0.18µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, mandatory, no NULLs                                 1.00      6.7±0.02µs        ? ?/sec    1.01      6.8±0.03µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, half NULLs                                1.02     96.8±0.07µs        ? ?/sec    1.00     95.1±0.21µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, no NULLs                                  1.00     10.2±0.02µs        ? ?/sec    1.01     10.3±0.04µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, mandatory, no NULLs                     1.00    160.4±0.39µs        ? ?/sec    1.00    160.7±0.43µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, half NULLs                    1.00    207.4±0.19µs        ? ?/sec    1.00    207.1±0.49µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, no NULLs                      1.00    163.0±0.32µs        ? ?/sec    1.10   180.0±15.82µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, mandatory, no NULLs                                 1.00      9.7±0.02µs        ? ?/sec    1.00      9.7±0.04µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, half NULLs                                1.01    132.1±0.09µs        ? ?/sec    1.00    131.3±0.32µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, no NULLs                                  1.01     13.3±0.01µs        ? ?/sec    1.00     13.2±0.07µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, mandatory, no NULLs                     1.00    320.4±0.63µs        ? ?/sec    1.00    320.7±0.45µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, half NULLs                    1.01    284.1±0.28µs        ? ?/sec    1.00    281.9±0.43µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, no NULLs                      1.00    326.0±0.38µs        ? ?/sec    1.00    326.4±1.00µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, mandatory, no NULLs                                 1.02     15.9±0.03µs        ? ?/sec    1.00     15.5±0.04µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, half NULLs                                1.01    131.2±0.16µs        ? ?/sec    1.00    129.9±0.21µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, no NULLs                                  1.00     20.5±0.02µs        ? ?/sec    1.01     20.7±0.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed increasing value                                    1.02     87.0±0.42µs        ? ?/sec    1.00     85.2±0.34µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed single value                                        1.01     78.2±0.22µs        ? ?/sec    1.00     77.3±0.52µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip increasing value                               1.16     57.5±0.30µs        ? ?/sec    1.00     49.7±0.27µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip single value                                   1.09     49.4±0.12µs        ? ?/sec    1.00     45.2±0.35µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip stepped increasing value                       1.01     73.7±0.60µs        ? ?/sec    1.00     73.2±0.08µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.01     88.2±0.15µs        ? ?/sec    1.00     87.6±0.28µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, half NULLs                          1.00     89.3±0.16µs        ? ?/sec    1.00     89.3±0.21µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, no NULLs                            1.00     90.5±0.14µs        ? ?/sec    1.00     90.1±0.24µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed stepped increasing value                            1.00    106.0±0.17µs        ? ?/sec    1.00    105.6±0.17µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, mandatory, no NULLs                                1.01    125.1±0.41µs        ? ?/sec    1.00    124.0±0.32µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, half NULLs                               1.00    146.8±0.28µs        ? ?/sec    1.00    147.4±0.29µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, no NULLs                                 1.00    128.3±0.24µs        ? ?/sec    1.00    128.1±0.66µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.01     54.4±0.08µs        ? ?/sec    1.00     53.9±0.09µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.00    110.5±0.17µs        ? ?/sec    1.00    110.9±0.11µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     57.6±0.06µs        ? ?/sec    1.00     57.7±0.09µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00     83.7±0.06µs        ? ?/sec    1.01     84.2±0.11µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, half NULLs                          1.00    127.8±0.16µs        ? ?/sec    1.00    128.3±0.27µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00     87.8±0.04µs        ? ?/sec    1.00     87.7±0.10µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, mandatory, no NULLs                                1.03     48.4±0.07µs        ? ?/sec    1.00     47.1±0.23µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, half NULLs                               1.00    107.9±0.13µs        ? ?/sec    1.00    108.1±0.18µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, no NULLs                                 1.00     50.8±0.06µs        ? ?/sec    1.00     50.9±0.08µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed increasing value                                    1.00     77.2±0.19µs        ? ?/sec    1.00     77.4±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed single value                                        1.00     73.9±0.24µs        ? ?/sec    1.00     74.2±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip increasing value                               1.15     49.8±0.11µs        ? ?/sec    1.00     43.3±0.08µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip single value                                   1.09     45.1±0.13µs        ? ?/sec    1.00     41.5±0.09µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip stepped increasing value                       1.05     70.1±0.44µs        ? ?/sec    1.00     67.0±0.08µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.00     79.1±0.25µs        ? ?/sec    1.00     79.1±0.10µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, half NULLs                          1.00     89.7±0.10µs        ? ?/sec    1.00     90.1±0.11µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, no NULLs                            1.00     81.2±0.11µs        ? ?/sec    1.00     81.2±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed stepped increasing value                            1.05    104.4±1.97µs        ? ?/sec    1.00     99.1±0.17µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, mandatory, no NULLs                                1.00    114.1±0.14µs        ? ?/sec    1.00    114.1±0.12µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, half NULLs                               1.00    152.0±0.49µs        ? ?/sec    1.00    151.4±0.17µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, no NULLs                                 1.00    118.1±0.15µs        ? ?/sec    1.00    118.0±0.15µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.00     82.9±0.10µs        ? ?/sec    1.00     83.1±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.00    135.7±0.16µs        ? ?/sec    1.00    135.7±0.17µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     87.2±0.12µs        ? ?/sec    1.01     87.8±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00     86.4±0.07µs        ? ?/sec    1.00     86.5±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, half NULLs                          1.00    139.6±0.11µs        ? ?/sec    1.00    139.4±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00     90.5±0.06µs        ? ?/sec    1.00     90.3±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, mandatory, no NULLs                                1.00     54.4±0.52µs        ? ?/sec    1.01     54.8±0.16µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, half NULLs                               1.00    121.8±0.14µs        ? ?/sec    1.00    121.4±0.39µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, no NULLs                                 1.01     58.5±0.08µs        ? ?/sec    1.00     58.2±0.24µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed increasing value                                               1.00     52.8±0.32µs        ? ?/sec    1.02     53.9±0.29µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed single value                                                   1.00     44.2±0.28µs        ? ?/sec    1.01     44.9±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip increasing value                                          1.21     40.0±0.24µs        ? ?/sec    1.00     33.1±0.27µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip single value                                              1.11     31.7±0.21µs        ? ?/sec    1.00     28.5±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip stepped increasing value                                  1.00     56.2±0.09µs        ? ?/sec    1.00     56.3±0.09µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, mandatory, no NULLs                                      1.01     71.6±0.14µs        ? ?/sec    1.00     70.8±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, half NULLs                                     1.00     72.1±0.15µs        ? ?/sec    1.01     72.6±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, no NULLs                                       1.01     73.6±0.16µs        ? ?/sec    1.00     73.1±0.12µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed stepped increasing value                                       1.01     72.9±0.19µs        ? ?/sec    1.00     72.5±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, mandatory, no NULLs                                           1.01     91.7±0.20µs        ? ?/sec    1.00     91.1±0.22µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, half NULLs                                          1.00    113.3±0.22µs        ? ?/sec    1.00    113.2±0.23µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, no NULLs                                            1.01     95.6±0.20µs        ? ?/sec    1.00     94.7±0.21µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     20.9±0.04µs        ? ?/sec    1.00     20.9±0.02µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, half NULLs                              1.00     77.4±0.13µs        ? ?/sec    1.00     77.4±0.11µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, no NULLs                                1.00     24.6±0.04µs        ? ?/sec    1.00     24.6±0.04µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, mandatory, no NULLs                                      1.00     51.3±0.04µs        ? ?/sec    1.00     51.1±0.04µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, half NULLs                                     1.00     94.7±0.21µs        ? ?/sec    1.01     95.2±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, no NULLs                                       1.00     54.8±0.06µs        ? ?/sec    1.00     54.8±0.05µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, mandatory, no NULLs                                           1.00     13.8±0.03µs        ? ?/sec    1.00     13.8±0.02µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, half NULLs                                          1.00     74.0±0.12µs        ? ?/sec    1.01     74.4±0.11µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, no NULLs                                            1.00     17.7±0.03µs        ? ?/sec    1.01     17.8±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed increasing value                                               1.02     50.2±0.38µs        ? ?/sec    1.00     49.1±0.51µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed single value                                                   1.00     41.3±0.18µs        ? ?/sec    1.00     41.1±0.18µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip increasing value                                          1.23     38.2±0.38µs        ? ?/sec    1.00     31.1±0.27µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip single value                                              1.14     30.3±0.14µs        ? ?/sec    1.00     26.5±0.12µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip stepped increasing value                                  1.00     54.4±0.09µs        ? ?/sec    1.01     54.7±0.10µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, mandatory, no NULLs                                      1.00     69.6±0.15µs        ? ?/sec    1.00     69.4±0.09µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, half NULLs                                     1.00     71.2±0.11µs        ? ?/sec    1.00     71.3±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, no NULLs                                       1.01     71.8±0.15µs        ? ?/sec    1.00     71.3±0.17µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed stepped increasing value                                       1.01     69.4±0.16µs        ? ?/sec    1.00     69.0±0.12µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, mandatory, no NULLs                                           1.01     87.8±0.25µs        ? ?/sec    1.00     87.3±0.21µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, half NULLs                                          1.00    111.1±0.23µs        ? ?/sec    1.00    110.7±0.25µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, no NULLs                                            1.00     91.8±0.21µs        ? ?/sec    1.00     91.4±0.16µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     17.3±0.02µs        ? ?/sec    1.00     17.3±0.01µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, half NULLs                              1.00     74.6±0.10µs        ? ?/sec    1.01     75.1±0.18µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, no NULLs                                1.01     21.0±0.02µs        ? ?/sec    1.00     20.8±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, mandatory, no NULLs                                      1.02     48.6±0.05µs        ? ?/sec    1.00     47.5±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, half NULLs                                     1.00     92.1±0.18µs        ? ?/sec    1.00     92.3±0.20µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, no NULLs                                       1.00     51.2±0.05µs        ? ?/sec    1.00     51.3±0.04µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, mandatory, no NULLs                                           1.00      9.9±0.01µs        ? ?/sec    1.00      9.9±0.03µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, half NULLs                                          1.00     72.2±0.11µs        ? ?/sec    1.00     72.3±0.07µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, no NULLs                                            1.00     13.6±0.03µs        ? ?/sec    1.00     13.7±0.03µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed increasing value                                               1.00     40.4±0.10µs        ? ?/sec    1.00     40.6±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed single value                                                   1.00     37.4±0.12µs        ? ?/sec    1.00     37.4±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip increasing value                                          1.27     30.9±0.09µs        ? ?/sec    1.00     24.3±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip single value                                              1.16     26.2±0.11µs        ? ?/sec    1.00     22.6±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip stepped increasing value                                  1.01     48.6±0.05µs        ? ?/sec    1.00     48.1±0.06µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, mandatory, no NULLs                                      1.00     60.3±0.08µs        ? ?/sec    1.00     60.1±0.22µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, half NULLs                                     1.00     71.2±0.09µs        ? ?/sec    1.00     71.2±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, no NULLs                                       1.00     62.1±0.09µs        ? ?/sec    1.01     62.5±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed stepped increasing value                                       1.03     63.4±0.10µs        ? ?/sec    1.00     61.7±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, mandatory, no NULLs                                           1.00     77.1±0.12µs        ? ?/sec    1.00     76.9±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, half NULLs                                          1.00    114.7±0.10µs        ? ?/sec    1.00    114.5±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, no NULLs                                            1.00     81.5±0.10µs        ? ?/sec    1.00     81.2±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     45.7±0.04µs        ? ?/sec    1.00     45.6±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, half NULLs                              1.00     99.0±0.09µs        ? ?/sec    1.00     98.9±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, no NULLs                                1.00     49.7±0.06µs        ? ?/sec    1.00     49.6±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, mandatory, no NULLs                                      1.00     49.4±0.04µs        ? ?/sec    1.00     49.6±0.03µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, half NULLs                                     1.00    102.4±0.09µs        ? ?/sec    1.00    102.0±0.13µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, no NULLs                                       1.00     53.5±0.10µs        ? ?/sec    1.00     53.3±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, mandatory, no NULLs                                           1.00     16.5±0.06µs        ? ?/sec    1.00     16.5±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, half NULLs                                          1.01     85.0±0.08µs        ? ?/sec    1.00     84.4±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, no NULLs                                            1.00     20.0±0.04µs        ? ?/sec    1.01     20.2±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed increasing value                                                1.01     53.4±0.38µs        ? ?/sec    1.00     52.9±0.40µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed single value                                                    1.00     44.6±0.19µs        ? ?/sec    1.00     44.4±0.22µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip increasing value                                           1.23     40.5±0.30µs        ? ?/sec    1.00     32.9±0.34µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip single value                                               1.13     31.9±0.16µs        ? ?/sec    1.00     28.3±0.15µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip stepped increasing value                                   1.00     56.1±0.09µs        ? ?/sec    1.00     56.3±0.09µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, mandatory, no NULLs                                       1.00     71.4±0.07µs        ? ?/sec    1.00     71.4±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, half NULLs                                      1.00     72.3±0.11µs        ? ?/sec    1.00     72.5±0.10µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, no NULLs                                        1.00     73.4±0.07µs        ? ?/sec    1.00     73.6±0.09µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed stepped increasing value                                        1.01     72.7±0.14µs        ? ?/sec    1.00     72.1±0.12µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, mandatory, no NULLs                                            1.00     91.3±0.17µs        ? ?/sec    1.01     91.8±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, half NULLs                                           1.00    113.8±0.22µs        ? ?/sec    1.00    113.6±0.20µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, no NULLs                                             1.00     95.4±0.12µs        ? ?/sec    1.00     95.4±0.08µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, mandatory, no NULLs                                1.00     20.8±0.07µs        ? ?/sec    1.00     20.8±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, half NULLs                               1.00     77.5±0.15µs        ? ?/sec    1.01     78.0±0.13µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, no NULLs                                 1.00     24.4±0.04µs        ? ?/sec    1.02     24.8±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, mandatory, no NULLs                                       1.00     50.7±0.05µs        ? ?/sec    1.01     51.0±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, half NULLs                                      1.00     94.7±0.19µs        ? ?/sec    1.00     95.0±0.17µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, no NULLs                                        1.00     54.5±0.05µs        ? ?/sec    1.00     54.5±0.03µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, mandatory, no NULLs                                            1.02     13.6±0.04µs        ? ?/sec    1.00     13.4±0.02µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, half NULLs                                           1.00     74.4±0.19µs        ? ?/sec    1.00     74.4±0.12µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, no NULLs                                             1.00     17.4±0.03µ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.05ms        ? ?/sec    1.01      3.9±0.05ms        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings no NULLs                                       1.00      7.1±0.13ms        ? ?/sec    1.00      7.1±0.17ms        ? ?/sec
arrow_array_reader/StringArray/const delta byte array encoded, mandatory, no NULLs                         1.05    535.2±8.91µs        ? ?/sec    1.00    510.6±1.22µs        ? ?/sec
arrow_array_reader/StringArray/const delta length byte array encoded, mandatory, no NULLs                  1.00    214.7±3.57µs        ? ?/sec    1.00    214.4±4.64µs        ? ?/sec
arrow_array_reader/StringArray/const prefix delta byte array encoded, mandatory, no NULLs                  1.00   753.0±44.48µs        ? ?/sec    1.02   767.3±34.95µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, mandatory, no NULLs                                     1.02    277.4±0.29µs        ? ?/sec    1.00    272.2±0.21µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, half NULLs                                    1.00    387.4±0.50µs        ? ?/sec    1.00    389.3±0.99µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, no NULLs                                      1.00    281.1±0.25µs        ? ?/sec    1.02    287.4±0.80µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, mandatory, no NULLs                                          1.00    458.9±8.24µs        ? ?/sec    1.01   463.7±11.52µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, half NULLs                                         1.00    491.0±5.82µs        ? ?/sec    1.00    492.8±4.10µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, no NULLs                                           1.00   462.7±10.56µs        ? ?/sec    1.01    469.3±7.58µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, mandatory, no NULLs                                1.00    257.0±1.31µs        ? ?/sec    1.00    258.1±0.75µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, half NULLs                               1.00    282.7±1.19µs        ? ?/sec    1.01    284.5±1.36µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, no NULLs                                 1.00    260.1±0.66µs        ? ?/sec    1.00    261.0±0.75µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, mandatory, no NULLs                                 1.00     79.6±0.06µs        ? ?/sec    1.00     79.5±0.06µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, half NULLs                                1.00    107.7±0.13µs        ? ?/sec    1.00    108.2±0.12µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, no NULLs                                  1.00     83.5±0.11µs        ? ?/sec    1.00     83.2±0.06µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, mandatory, no NULLs                                      1.01    217.6±0.62µs        ? ?/sec    1.00    216.5±0.46µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, half NULLs                                     1.00    181.7±0.51µs        ? ?/sec    1.01    184.3±7.77µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, no NULLs                                       1.00    223.9±0.65µs        ? ?/sec    1.01    225.5±0.70µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed increasing value                                              1.00     52.5±0.34µs        ? ?/sec    1.02     53.3±0.35µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed single value                                                  1.00     43.8±0.48µs        ? ?/sec    1.02     44.8±0.18µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip increasing value                                         1.20     39.8±0.23µs        ? ?/sec    1.00     33.2±0.23µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip single value                                             1.11     31.5±0.28µs        ? ?/sec    1.00     28.5±0.12µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip stepped increasing value                                 1.00     56.2±0.08µs        ? ?/sec    1.00     56.3±0.10µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, mandatory, no NULLs                                     1.00     75.8±0.09µs        ? ?/sec    1.00     76.0±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, half NULLs                                    1.00     75.1±0.14µs        ? ?/sec    1.01     75.5±0.13µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, no NULLs                                      1.00     77.8±0.19µs        ? ?/sec    1.00     77.9±0.10µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed stepped increasing value                                      1.01     73.1±0.94µs        ? ?/sec    1.00     72.3±0.14µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, mandatory, no NULLs                                          1.00     97.3±0.26µs        ? ?/sec    1.00     97.3±0.18µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, half NULLs                                         1.00    117.0±0.25µs        ? ?/sec    1.01    117.8±0.23µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, no NULLs                                           1.01    101.7±0.25µs        ? ?/sec    1.00    101.0±0.18µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     20.9±0.04µs        ? ?/sec    1.00     20.9±0.04µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, half NULLs                             1.00     77.9±0.15µs        ? ?/sec    1.00     78.1±0.12µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, no NULLs                               1.00     24.5±0.04µs        ? ?/sec    1.00     24.6±0.02µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, mandatory, no NULLs                                     1.00     51.0±0.04µs        ? ?/sec    1.00     51.0±0.05µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, half NULLs                                    1.01     96.2±0.18µs        ? ?/sec    1.00     94.9±0.15µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, no NULLs                                      1.00     54.7±0.06µs        ? ?/sec    1.00     54.8±0.06µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, mandatory, no NULLs                                          1.00     13.8±0.03µs        ? ?/sec    1.00     13.9±0.02µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, half NULLs                                         1.00     74.5±0.15µs        ? ?/sec    1.00     74.8±0.14µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, no NULLs                                           1.00     17.4±0.03µs        ? ?/sec    1.01     17.6±0.06µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed increasing value                                              1.00     49.4±0.35µs        ? ?/sec    1.02     50.3±0.29µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed single value                                                  1.00     41.1±0.26µs        ? ?/sec    1.01     41.5±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip increasing value                                         1.22     38.5±0.28µs        ? ?/sec    1.00     31.4±0.23µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip single value                                             1.12     30.0±0.24µs        ? ?/sec    1.00     26.7±0.14µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip stepped increasing value                                 1.00     54.5±0.16µs        ? ?/sec    1.00     54.6±0.10µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, mandatory, no NULLs                                     1.01     69.9±0.22µs        ? ?/sec    1.00     69.3±0.12µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, half NULLs                                    1.01     71.3±0.25µs        ? ?/sec    1.00     70.8±0.15µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, no NULLs                                      1.01     71.8±0.34µs        ? ?/sec    1.00     71.2±0.13µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed stepped increasing value                                      1.01     69.5±0.23µs        ? ?/sec    1.00     69.0±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, mandatory, no NULLs                                          1.00     87.7±0.48µs        ? ?/sec    1.00     87.8±0.21µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, half NULLs                                         1.00    111.0±0.29µs        ? ?/sec    1.00    110.8±0.24µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, no NULLs                                           1.01     91.8±0.47µs        ? ?/sec    1.00     91.2±0.24µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     17.5±0.04µs        ? ?/sec    1.00     17.5±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, half NULLs                             1.00     74.7±0.20µs        ? ?/sec    1.00     74.7±0.10µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, no NULLs                               1.00     21.1±0.05µs        ? ?/sec    1.01     21.3±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, mandatory, no NULLs                                     1.00     47.6±0.09µs        ? ?/sec    1.00     47.6±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, half NULLs                                    1.00     91.4±0.24µs        ? ?/sec    1.00     91.7±0.18µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, no NULLs                                      1.00     51.4±0.20µs        ? ?/sec    1.00     51.4±0.05µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, mandatory, no NULLs                                          1.00     10.0±0.03µs        ? ?/sec    1.01     10.1±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, half NULLs                                         1.00     72.2±0.16µs        ? ?/sec    1.00     71.9±0.08µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, no NULLs                                           1.01     13.9±0.02µs        ? ?/sec    1.00     13.7±0.02µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed increasing value                                              1.01     40.7±0.15µs        ? ?/sec    1.00     40.5±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed single value                                                  1.00     37.7±0.21µs        ? ?/sec    1.00     37.7±0.16µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip increasing value                                         1.28     31.1±0.11µs        ? ?/sec    1.00     24.3±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip single value                                             1.18     26.6±0.13µs        ? ?/sec    1.00     22.6±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip stepped increasing value                                 1.01     48.6±0.06µs        ? ?/sec    1.00     48.1±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, mandatory, no NULLs                                     1.00     60.3±0.09µs        ? ?/sec    1.00     60.2±0.09µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, half NULLs                                    1.00     71.5±0.09µs        ? ?/sec    1.00     71.1±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, no NULLs                                      1.00     62.5±0.09µs        ? ?/sec    1.00     62.4±0.08µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed stepped increasing value                                      1.03     63.4±0.11µs        ? ?/sec    1.00     61.8±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, mandatory, no NULLs                                          1.00     77.2±0.11µs        ? ?/sec    1.00     77.3±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, half NULLs                                         1.00    114.8±0.08µs        ? ?/sec    1.00    114.7±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, no NULLs                                           1.00     81.0±0.11µs        ? ?/sec    1.00     81.3±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, mandatory, no NULLs                              1.01     46.0±0.04µs        ? ?/sec    1.00     45.7±0.05µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, half NULLs                             1.00     99.1±0.19µs        ? ?/sec    1.00     99.2±0.11µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, no NULLs                               1.00     49.7±0.07µs        ? ?/sec    1.00     49.9±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, mandatory, no NULLs                                     1.01     49.6±0.15µs        ? ?/sec    1.00     49.3±0.14µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, half NULLs                                    1.00    102.0±0.13µs        ? ?/sec    1.00    102.1±0.07µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, no NULLs                                      1.00     53.5±0.16µs        ? ?/sec    1.00     53.3±0.14µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, mandatory, no NULLs                                          1.00     16.5±0.03µs        ? ?/sec    1.02     16.7±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, half NULLs                                         1.01     85.6±0.10µs        ? ?/sec    1.00     84.5±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, no NULLs                                           1.00     20.1±0.04µs        ? ?/sec    1.02     20.4±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed increasing value                                               1.01     53.6±0.25µs        ? ?/sec    1.00     52.9±0.58µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed single value                                                   1.00     44.5±0.13µs        ? ?/sec    1.01     44.9±0.31µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip increasing value                                          1.23     40.5±0.19µs        ? ?/sec    1.00     33.0±0.42µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip single value                                              1.12     31.9±0.12µs        ? ?/sec    1.00     28.5±0.20µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip stepped increasing value                                  1.00     56.2±0.18µs        ? ?/sec    1.00     56.2±0.08µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, mandatory, no NULLs                                      1.00     74.4±0.05µs        ? ?/sec    1.00     74.8±0.09µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, half NULLs                                     1.00     74.0±0.11µs        ? ?/sec    1.00     74.2±0.12µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, no NULLs                                       1.00     76.6±0.08µs        ? ?/sec    1.01     77.0±0.09µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed stepped increasing value                                       1.01     73.1±0.15µs        ? ?/sec    1.00     72.3±0.10µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, mandatory, no NULLs                                           1.00     95.8±0.13µs        ? ?/sec    1.00     95.8±0.13µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, half NULLs                                          1.00    116.4±0.19µs        ? ?/sec    1.00    116.0±0.18µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, no NULLs                                            1.00     99.7±0.13µs        ? ?/sec    1.00     99.9±0.12µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, mandatory, no NULLs                               1.01     20.7±0.02µs        ? ?/sec    1.00     20.6±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, half NULLs                              1.00     76.9±0.11µs        ? ?/sec    1.00     77.0±0.10µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, no NULLs                                1.01     24.5±0.04µs        ? ?/sec    1.00     24.3±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, mandatory, no NULLs                                      1.00     50.7±0.04µs        ? ?/sec    1.01     51.2±0.05µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, half NULLs                                     1.00     94.8±0.28µs        ? ?/sec    1.00     94.9±0.17µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, no NULLs                                       1.00     54.2±0.06µs        ? ?/sec    1.01     54.6±0.05µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, mandatory, no NULLs                                           1.01     13.7±0.03µs        ? ?/sec    1.00     13.6±0.02µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, half NULLs                                          1.02     76.2±0.15µs        ? ?/sec    1.00     74.7±0.13µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, no NULLs                                            1.00     17.3±0.03µs        ? ?/sec    1.00     17.3±0.02µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, half NULLs            1.00     72.0±0.14µs        ? ?/sec    1.00     71.7±0.10µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, no NULLs              1.00     13.8±0.02µs        ? ?/sec    1.00     13.9±0.03µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, half NULLs             1.00    132.0±0.15µs        ? ?/sec    1.00    132.4±0.16µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, no NULLs               1.00     65.4±0.09µs        ? ?/sec    1.00     65.4±0.08µs        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 2835.6s
Peak memory 4.3 GiB
Avg memory 4.2 GiB
CPU user 2832.7s
CPU sys 1.0s
Peak spill 0 B

branch

Metric Value
Wall time 2835.6s
Peak memory 4.3 GiB
Avg memory 4.2 GiB
CPU user 2832.9s
CPU sys 0.5s
Peak spill 0 B

File an issue against this benchmark runner

@sahuagin
Copy link
Copy Markdown
Contributor Author

Note on benchmark variance: These results were collected on a non-isolated machine without CPU frequency pinning. Small variances of ±5% on non-bw=0 paths (particularly mandatory/optional, no NULLs) are consistent with measurement noise rather than real regressions — the changes to those code paths are additive only. The #[cold] annotation on the terminal path (PR #9787) was added specifically to prevent icache pressure on the non-terminal hot path. Happy to share raw criterion output or rerun on a more controlled setup if helpful.

@sahuagin sahuagin marked this pull request as ready for review April 22, 2026 03:09
@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 22, 2026

I took the liberty of fixing the cargo fmt issue and pushing to main

@alamb alamb merged commit 2d8cd5a into apache:main Apr 22, 2026
16 checks passed
sahuagin added a commit to sahuagin/arrow-rs that referenced this pull request Apr 22, 2026
- Restore "see commentary in self.get() above" pointer that ties this
  routine to the equivalent optimizations in get(), per etseidl review.
- Call out the min_delta == 0 case explicitly in the bw=0 branch
  comment so the no-op behavior is documented, not just implicit in
  the surrounding `if min_delta != 0` guard.

Addresses review feedback on apache#9786.
@sahuagin
Copy link
Copy Markdown
Contributor Author

Comments addressed in e302663a6. Full benchmark results on the updated branch against the upstream baseline:

Wins on the bw=0 paths

binary packed skip single value (all-same values → bw=0 throughout):

Type Change
Int8Array −22.0%
UInt8Array −19.1%
Int16Array −17.9%
UInt16Array −19.8%
Int32Array −21.3%
UInt32Array −21.0%
Int64Array −18.1%
UInt64Array −20.9%
INT32/Decimal128Array −9.7%
INT64/Decimal128Array −12.4%

binary packed skip increasing value (fixed stride → bw=0):

Type Change
Int8Array −21.7%
UInt8Array −14.8%
Int16Array −17.2%
UInt16Array −17.0%
Int32Array −16.1%
UInt32Array −18.0%
Int64Array −21.2%
UInt64Array −20.4%
INT32/Decimal128Array −9.1%
INT64/Decimal128Array −12.8%

binary packed skip stepped increasing value (mixed bw, some miniblocks bw=0):

Type Change
Int8Array −10.4%
UInt8Array −4.1%
Int16Array −6.3%
UInt16Array −5.9%
Int32Array −6.4%
UInt32Array −7.3%
Int64Array +1.3%
UInt64Array +2.5%
INT32/Decimal128Array −4.4%
INT64/Decimal128Array +2.6%

The magnitude scales with how much of the column is bw=0 (single-value: every miniblock; increasing-value: every miniblock; stepped-increasing: depends on where the step lands within a miniblock).

Non-target paths

mandatory/optional, no NULLs and optional, half NULLs variants exercise the non-terminal decode path, unchanged by this PR. These show uniform +3% to +10% regressions across types. Consistent with measurement variance on a non-isolated machine — the noise floor is raised but the signs are mixed in both directions across the two bench runs I did today on the same hardware.

Measurement conditions

Non-isolated machine, no CPU pinning, browser tabs and background processes active. For the bw=0 target paths the signal (−18% to −22% on single-value) is large enough to read through any plausible noise; for the non-target paths I'd discount the numbers.

Happy to rerun on more controlled hardware if useful.

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.

parquet: O(1) skip for bw=0 miniblocks in DeltaBitPackDecoder

4 participants