Skip to content

perf(parquet): Skip per-level validity pass for list children with no nulls - #11376

Merged
alamb merged 6 commits into
apache:mainfrom
neilconway:neilc/fix-parquet-list-validity-regression
Oct 7, 2026
Merged

alamb merged 6 commits into
apache:mainfrom
neilconway:neilc/fix-parquet-list-validity-regression

Conversation

@neilconway

@neilconway neilconway commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

  • N/A

Rationale for this change

Since #9848, reading the child column of a list builds a compact validity bitmap with a pass over every definition level. When every definition level in a chunk has the maximum value (i.e., there are no null lists, empty lists, or null elements in any list), we can skip doing the pass over the definition levels and append an all-valid run instead.

Adding this pass caused a regression in list decoding performance between 58.3.0 and 59.1.0: for example, 232 ms -> 289 ms to read 5M rows with 62.5M values on an Apple M4 Max.

Benchmark for this case was added in #11375. Results on M4 Max:

  • StringList/no NULLs: +0.7%, −0.6%, +0.9%
  • StringList/half NULLs: +2.8%, +3.8%, +1.0%
  • StringList/90pct NULLs: +2.7%, +0.5%, +0.9%
  • StringList/99pct NULLs: +1.0%, +0.2%, +0.7%
  • Int32List/no NULLs: +0.8%, −0.3%, −0.2%
  • Int32List/half NULLs: +1.3%, −0.3%, +0.5%
  • Int32List/90pct NULLs: +0.6%, −0.9%, −0.3%
  • Int32List/99pct NULLs: +1.1%, −0.6%, +1.0%
  • Int32List/no NULLs or empty lists: −18.4%, −19.9%, −18.5%
  • Fixed32List/no NULLs: +1.2%, −0.8%, +1.1%
  • Fixed32List/half NULLs: +1.6%, +0.8%, +2.1%
  • Fixed32List/90pct NULLs: +0.4%, −0.5%, −0.5%
  • Fixed32List/99pct NULLs: +0.2%, +0.4%, +0.9%

What changes are included in this PR?

See above.

Are these changes tested?

Covered by existing tests.

Are there any significant user-facing changes?

No.

AI usage

Developed and revised with Claude Code (Opus 5.5).

The `ListArray` benchmarks pick list lengths from `0..MAX_LIST_LEN`, so even
the "no NULLs" cases have about 10% empty lists, and every batch contains
definition levels below the maximum. Columns of lists that are never null or
empty and have no null elements are common, but none of the benchmarks cover
them.

Add an `Int32List` case with no nulls and lengths from 1 to
`MAX_LIST_LEN - 1`, so that every definition level is at the maximum.
…out nulls

Since apache#9848, reading the child column of a list builds a compact validity
bitmap with a pass over every definition level, even when none of them is
null. When every definition level in a chunk is at the maximum
(`values_to_read == levels_to_read`), each level is a non-null child value,
so append an all-valid run instead.

This pass caused the list decoding regression between 58.3.0 and 59.1.0.

Reading a list<int64> column (5M rows, 62.5M values, written by pyarrow)
with `ParquetRecordBatchReader` on an Apple M4 Max: 289 ms -> 231 ms, back
to 58.3.0's 232 ms. The `arrow_array_reader/ListArray/Int32List/no NULLs or
empty lists` benchmark is 18-20% faster on the same machine.
@github-actions github-actions Bot added the parquet Changes to the parquet crate label Oct 4, 2026
@neilconway

Copy link
Copy Markdown
Contributor Author

FYI @HippoBaro @alamb

@HippoBaro

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: arrow_reader

Sharding factor: 1 (1 workers).

Comparing neilc/fix-parquet-list-validity-regression (fa6d271) to e97b1aa (merge-base) diff

Run configuration
run benchmark arrow_reader
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@HippoBaro

Copy link
Copy Markdown
Contributor

Hi @neilconway let me take a look!

@HippoBaro HippoBaro left a comment

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.

@alamb This is a follow-up to #9848 and LGTM.

I would recommend we also add a test that alternates all-valid and null-containing chunks, with a transition at a non-byte-aligned bitmap offset so we cover the interaction between the new fast path and the existing filtering path.

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: arrow_reader

Comparing neilc/fix-parquet-list-validity-regression (fa6d271) to e97b1aa (merge-base) diff

Run configuration
run benchmark arrow_reader
shards: 1
Details
group                                                                                                      base                                   changed
-----                                                                                                      ----                                   -------
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                           1.00    836.9±9.70µs        ? ?/sec    1.01   845.4±12.24µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                          1.02    964.2±7.99µs        ? ?/sec    1.00    945.6±4.91µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                            1.00    841.2±9.70µs        ? ?/sec    1.01   847.0±13.09µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, mandatory, no NULLs                                     1.04    286.0±0.24µs        ? ?/sec    1.00    275.6±0.11µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, mandatory, no NULLs, large values                       1.08     42.9±0.31ms        ? ?/sec    1.00     39.8±0.30ms        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, half NULLs                                    1.03    393.9±0.85µs        ? ?/sec    1.00    383.7±0.63µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, no NULLs                                      1.00    289.3±0.22µs        ? ?/sec    1.00    288.1±0.16µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, mandatory, no NULLs                                          1.00    406.9±6.30µs        ? ?/sec    1.00    407.3±6.31µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, half NULLs                                         1.02    474.8±2.54µs        ? ?/sec    1.00    464.4±1.88µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, no NULLs                                           1.00    402.8±2.80µs        ? ?/sec    1.00    402.3±2.95µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, mandatory, no NULLs                                 1.00     80.8±0.04µs        ? ?/sec    1.00     80.8±0.06µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, half NULLs                                1.00    111.9±0.19µs        ? ?/sec    1.00    111.7±0.12µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, no NULLs                                  1.00     84.4±0.07µs        ? ?/sec    1.00     84.4±0.06µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs                                      1.02    150.6±1.43µs        ? ?/sec    1.00    147.9±0.50µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs, short string                        1.05    150.3±3.60µs        ? ?/sec    1.00    143.3±6.65µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, half NULLs                                     1.02    151.6±0.88µs        ? ?/sec    1.00    148.9±0.56µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, no NULLs                                       1.02    156.3±1.23µs        ? ?/sec    1.00    152.7±0.42µs        ? ?/sec
arrow_array_reader/BooleanArray/plain encoded, mandatory, no NULLs                                         1.00    226.9±0.24µs        ? ?/sec    1.00    227.5±0.50µs        ? ?/sec
arrow_array_reader/BooleanArray/plain encoded, optional, half NULLs                                        1.00    244.6±1.47µs        ? ?/sec    1.00    243.8±1.47µs        ? ?/sec
arrow_array_reader/BooleanArray/plain encoded, optional, no NULLs                                          1.00    230.4±0.23µs        ? ?/sec    1.00    230.6±0.31µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs     1.11  1073.4±10.48µs        ? ?/sec    1.00    968.7±0.79µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, half NULLs    1.00    669.6±0.49µs        ? ?/sec    1.01    673.0±0.33µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, no NULLs      1.00    966.4±1.17µs        ? ?/sec    1.09  1055.6±14.85µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                 1.00    185.9±0.36µs        ? ?/sec    1.02    189.5±0.41µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                1.00    289.6±0.73µs        ? ?/sec    1.02    295.5±0.42µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                  1.00    191.8±2.00µs        ? ?/sec    1.02    194.9±0.57µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, mandatory, no NULLs        1.00    128.6±0.26µs        ? ?/sec    1.01    130.4±0.22µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, half NULLs       1.00    183.1±0.16µs        ? ?/sec    1.00    183.4±0.17µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, no NULLs         1.00    131.8±0.21µs        ? ?/sec    1.02    134.3±0.27µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, mandatory, no NULLs                    1.00     59.9±0.04µs        ? ?/sec    1.01     60.5±0.07µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, half NULLs                   1.00    147.1±0.10µs        ? ?/sec    1.00    147.1±0.09µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, no NULLs                     1.00     63.0±0.05µs        ? ?/sec    1.00     63.1±0.09µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, mandatory, no NULLs                    1.00    803.9±0.64µs        ? ?/sec    1.00    804.0±0.46µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, half NULLs                   1.01    517.0±0.98µs        ? ?/sec    1.00    510.9±0.39µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, no NULLs                     1.00    808.4±0.82µs        ? ?/sec    1.00    807.6±0.54µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, mandatory, no NULLs                                1.04     23.9±0.05µs        ? ?/sec    1.00     23.0±0.04µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, half NULLs                               1.00    130.1±0.11µs        ? ?/sec    1.01    131.8±0.14µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, no NULLs                                 1.00     27.6±0.08µs        ? ?/sec    1.02     28.2±0.05µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, mandatory, no NULLs                     1.00     74.2±0.13µs        ? ?/sec    1.02     75.6±0.18µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, half NULLs                    1.00    128.6±0.20µs        ? ?/sec    1.00    129.2±0.13µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, no NULLs                      1.00     78.0±0.96µs        ? ?/sec    1.04     81.3±0.13µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, mandatory, no NULLs                                 1.00      5.5±0.03µs        ? ?/sec    1.00      5.5±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, half NULLs                                1.00     92.8±0.07µs        ? ?/sec    1.01     93.5±0.23µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, no NULLs                                  1.00      8.8±0.02µs        ? ?/sec    1.02      9.0±0.03µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, mandatory, no NULLs                     1.00    146.4±0.45µs        ? ?/sec    1.02    148.6±0.30µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, half NULLs                    1.00    199.1±0.31µs        ? ?/sec    1.00    199.3±0.27µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, no NULLs                      1.00    148.1±1.10µs        ? ?/sec    1.05    155.7±0.30µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, mandatory, no NULLs                                 1.00      7.6±0.02µs        ? ?/sec    1.00      7.7±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, half NULLs                                1.00    128.2±0.15µs        ? ?/sec    1.00    127.8±0.11µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, no NULLs                                  1.00     11.1±0.03µs        ? ?/sec    1.03     11.4±0.02µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, mandatory, no NULLs                     1.00    296.1±0.91µs        ? ?/sec    1.01    300.1±1.03µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, half NULLs                    1.00    267.1±0.55µs        ? ?/sec    1.01    269.7±0.36µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, no NULLs                      1.00    304.0±1.53µs        ? ?/sec    1.01    305.9±0.64µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, mandatory, no NULLs                                 1.00     12.0±0.01µs        ? ?/sec    1.04     12.5±0.06µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, half NULLs                                1.00    123.3±0.06µs        ? ?/sec    1.01    124.2±0.14µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, no NULLs                                  1.00     16.0±0.10µs        ? ?/sec    1.01     16.1±0.02µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed increasing value                                    1.00     87.7±0.72µs        ? ?/sec    1.02     89.2±0.81µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed single value                                        1.00     80.0±0.33µs        ? ?/sec    1.02     81.8±0.42µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip increasing value                               1.00     50.4±0.43µs        ? ?/sec    1.01     51.2±0.43µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip single value                                   1.00     46.1±0.15µs        ? ?/sec    1.02     46.9±0.22µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip stepped increasing value                       1.00     75.8±0.55µs        ? ?/sec    1.00     75.6±0.10µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.00     89.6±1.04µs        ? ?/sec    1.00     89.8±0.16µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, half NULLs                          1.00     88.0±0.48µs        ? ?/sec    1.00     88.3±0.13µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, no NULLs                            1.00     91.7±1.02µs        ? ?/sec    1.00     91.8±0.22µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed stepped increasing value                            1.00    108.4±0.19µs        ? ?/sec    1.01    109.3±0.14µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, mandatory, no NULLs                                1.00    126.6±0.93µs        ? ?/sec    1.00    126.6±0.88µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, half NULLs                               1.00    145.4±0.52µs        ? ?/sec    1.00    145.8±0.53µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, no NULLs                                 1.00    130.6±0.87µs        ? ?/sec    1.00    130.2±1.12µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.01     54.5±0.07µs        ? ?/sec    1.00     54.1±0.04µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.01    109.0±0.21µs        ? ?/sec    1.00    108.2±0.23µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     57.7±0.06µs        ? ?/sec    1.00     57.5±0.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00     84.5±0.05µs        ? ?/sec    1.00     84.6±0.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, half NULLs                          1.00    126.1±0.28µs        ? ?/sec    1.00    125.8±0.22µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00     88.1±0.04µs        ? ?/sec    1.00     87.9±0.06µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, mandatory, no NULLs                                1.03     49.1±0.28µs        ? ?/sec    1.00     47.5±0.04µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, half NULLs                               1.01    106.1±0.25µs        ? ?/sec    1.00    104.7±0.17µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, no NULLs                                 1.01     50.8±0.11µs        ? ?/sec    1.00     50.5±0.03µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed increasing value                                    1.00     78.8±0.11µs        ? ?/sec    1.01     79.3±0.20µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed single value                                        1.00     75.3±0.17µs        ? ?/sec    1.00     75.2±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip increasing value                               1.00     43.5±0.06µs        ? ?/sec    1.00     43.6±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip single value                                   1.00     41.7±0.04µs        ? ?/sec    1.00     41.6±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip stepped increasing value                       1.00     68.0±0.11µs        ? ?/sec    1.00     67.7±0.07µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.00     79.7±0.11µs        ? ?/sec    1.00     79.5±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, half NULLs                          1.00     83.9±0.11µs        ? ?/sec    1.00     84.0±0.14µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, no NULLs                            1.00     81.6±0.15µs        ? ?/sec    1.00     81.5±0.13µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed stepped increasing value                            1.00    100.7±0.12µs        ? ?/sec    1.01    101.6±0.20µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, mandatory, no NULLs                                1.00    114.7±0.16µs        ? ?/sec    1.00    114.8±0.20µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, half NULLs                               1.00    141.3±0.22µs        ? ?/sec    1.00    141.4±0.31µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, no NULLs                                 1.00    118.5±0.15µs        ? ?/sec    1.00    118.2±0.15µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.00     83.5±0.04µs        ? ?/sec    1.01     84.4±0.17µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.00    124.5±0.13µs        ? ?/sec    1.00    125.0±0.24µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.00     88.0±0.10µs        ? ?/sec    1.01     88.5±0.23µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00     87.2±0.18µs        ? ?/sec    1.00     87.4±0.32µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, half NULLs                          1.00    128.4±0.27µs        ? ?/sec    1.00    128.7±0.27µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00     90.8±0.06µs        ? ?/sec    1.00     90.9±0.06µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, mandatory, no NULLs                                1.00     54.5±0.06µs        ? ?/sec    1.01     54.9±0.44µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, half NULLs                               1.00    110.1±0.16µs        ? ?/sec    1.00    110.3±0.26µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, no NULLs                                 1.00     58.3±0.05µs        ? ?/sec    1.00     58.1±0.08µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed increasing value                                               1.00     55.0±0.56µs        ? ?/sec    1.00     55.1±0.58µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed single value                                                   1.00     46.4±0.66µs        ? ?/sec    1.00     46.6±0.59µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip increasing value                                          1.00     33.5±0.31µs        ? ?/sec    1.01     33.7±0.36µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip single value                                              1.00     28.9±0.35µs        ? ?/sec    1.01     29.1±0.31µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip stepped increasing value                                  1.00     58.0±0.26µs        ? ?/sec    1.01     58.5±0.15µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, mandatory, no NULLs                                      1.01     72.5±0.95µs        ? ?/sec    1.00     72.1±0.55µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, half NULLs                                     1.01     71.1±0.52µs        ? ?/sec    1.00     70.5±0.30µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, no NULLs                                       1.01     74.7±0.93µs        ? ?/sec    1.00     74.0±0.54µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed stepped increasing value                                       1.00     75.2±0.14µs        ? ?/sec    1.01     75.7±0.29µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, mandatory, no NULLs                                           1.00     92.2±0.32µs        ? ?/sec    1.00     92.3±0.24µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, half NULLs                                          1.00    111.3±0.22µs        ? ?/sec    1.00    111.1±0.30µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, no NULLs                                            1.00     95.8±0.28µs        ? ?/sec    1.00     95.4±0.27µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     21.1±0.02µs        ? ?/sec    1.00     21.1±0.02µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, half NULLs                              1.01     75.1±0.13µs        ? ?/sec    1.00     74.7±0.17µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, no NULLs                                1.00     24.5±0.03µs        ? ?/sec    1.00     24.5±0.02µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, mandatory, no NULLs                                      1.01     51.5±0.03µs        ? ?/sec    1.00     51.2±0.03µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, half NULLs                                     1.00     92.9±0.21µs        ? ?/sec    1.00     92.6±0.18µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, no NULLs                                       1.00     55.1±0.05µs        ? ?/sec    1.00     54.9±0.04µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, mandatory, no NULLs                                           1.00     13.9±0.04µs        ? ?/sec    1.00     14.0±0.02µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, half NULLs                                          1.00     72.4±0.20µs        ? ?/sec    1.00     72.4±0.14µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, no NULLs                                            1.00     17.6±0.05µs        ? ?/sec    1.02     17.9±0.02µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed increasing value                                               1.00     51.0±0.62µs        ? ?/sec    1.01     51.3±0.66µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed single value                                                   1.00     43.2±0.29µs        ? ?/sec    1.02     44.1±0.43µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip increasing value                                          1.00     31.6±0.30µs        ? ?/sec    1.01     31.8±0.35µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip single value                                              1.00     27.4±0.18µs        ? ?/sec    1.02     27.9±0.19µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip stepped increasing value                                  1.00     56.1±0.25µs        ? ?/sec    1.01     56.5±0.09µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, mandatory, no NULLs                                      1.00     71.0±1.04µs        ? ?/sec    1.00     70.9±0.15µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, half NULLs                                     1.00     69.8±0.53µs        ? ?/sec    1.00     69.4±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, no NULLs                                       1.00     73.1±1.03µs        ? ?/sec    1.00     73.0±0.18µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed stepped increasing value                                       1.00     71.4±0.13µs        ? ?/sec    1.01     71.9±0.14µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, mandatory, no NULLs                                           1.00     89.6±0.78µs        ? ?/sec    1.00     89.7±0.84µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, half NULLs                                          1.00    109.2±0.42µs        ? ?/sec    1.00    108.9±0.47µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, no NULLs                                            1.00     93.1±0.76µs        ? ?/sec    1.00     93.5±0.82µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     17.5±0.02µs        ? ?/sec    1.01     17.6±0.02µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, half NULLs                              1.00     72.0±0.13µs        ? ?/sec    1.00     71.8±0.17µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, no NULLs                                1.00     20.7±0.04µs        ? ?/sec    1.02     21.1±0.05µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, mandatory, no NULLs                                      1.00     47.8±0.03µs        ? ?/sec    1.00     47.8±0.04µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, half NULLs                                     1.00     89.4±0.19µs        ? ?/sec    1.00     89.4±0.23µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, no NULLs                                       1.00     51.4±0.06µs        ? ?/sec    1.00     51.3±0.07µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, mandatory, no NULLs                                           1.00      9.9±0.02µs        ? ?/sec    1.01     10.0±0.02µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, half NULLs                                          1.01     69.2±0.12µs        ? ?/sec    1.00     68.7±0.13µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, no NULLs                                            1.00     13.6±0.06µs        ? ?/sec    1.01     13.7±0.02µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed increasing value                                               1.00     41.6±0.12µs        ? ?/sec    1.00     41.6±0.15µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed single value                                                   1.00     38.1±0.08µs        ? ?/sec    1.00     38.1±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip increasing value                                          1.00     24.8±0.05µs        ? ?/sec    1.00     24.7±0.08µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip single value                                              1.00     22.7±0.05µs        ? ?/sec    1.00     22.7±0.03µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip stepped increasing value                                  1.00     48.9±0.06µs        ? ?/sec    1.00     48.9±0.06µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, mandatory, no NULLs                                      1.00     60.8±0.06µs        ? ?/sec    1.00     60.7±0.13µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, half NULLs                                     1.00     65.1±0.13µs        ? ?/sec    1.00     65.2±0.10µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, no NULLs                                       1.00     62.6±0.05µs        ? ?/sec    1.00     62.7±0.12µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed stepped increasing value                                       1.01     63.5±0.10µs        ? ?/sec    1.00     63.1±0.11µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, mandatory, no NULLs                                           1.00     77.8±0.13µs        ? ?/sec    1.00     78.1±0.16µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, half NULLs                                          1.00    103.9±0.25µs        ? ?/sec    1.01    104.7±0.26µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, no NULLs                                            1.00     81.7±0.16µs        ? ?/sec    1.00     81.7±0.14µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, mandatory, no NULLs                               1.00     45.7±0.03µs        ? ?/sec    1.01     46.4±0.02µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, half NULLs                              1.00     87.7±0.14µs        ? ?/sec    1.01     88.2±0.18µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, no NULLs                                1.00     49.8±0.04µs        ? ?/sec    1.02     51.0±0.05µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, mandatory, no NULLs                                      1.00     50.2±0.03µs        ? ?/sec    1.00     50.1±0.03µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, half NULLs                                     1.00     91.9±0.25µs        ? ?/sec    1.00     91.5±0.16µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, no NULLs                                       1.00     53.7±0.06µs        ? ?/sec    1.00     53.6±0.09µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, mandatory, no NULLs                                           1.03     16.9±0.06µs        ? ?/sec    1.00     16.3±0.02µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, half NULLs                                          1.00     73.2±0.16µs        ? ?/sec    1.02     74.4±0.26µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, no NULLs                                            1.02     20.5±0.02µs        ? ?/sec    1.00     20.1±0.02µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed increasing value                                                1.00     54.4±0.57µs        ? ?/sec    1.01     55.0±0.50µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed single value                                                    1.00     46.5±0.41µs        ? ?/sec    1.00     46.6±0.75µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip increasing value                                           1.00     33.3±0.29µs        ? ?/sec    1.01     33.6±0.32µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip single value                                               1.00     29.0±0.17µs        ? ?/sec    1.01     29.1±0.38µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip stepped increasing value                                   1.00     58.0±0.26µs        ? ?/sec    1.00     58.2±0.12µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, mandatory, no NULLs                                       1.00     72.0±0.83µs        ? ?/sec    1.00     71.9±0.58µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, half NULLs                                      1.00     70.7±0.43µs        ? ?/sec    1.00     70.5±0.27µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, no NULLs                                        1.00     74.3±0.81µs        ? ?/sec    1.00     74.0±0.58µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed stepped increasing value                                        1.00     75.1±0.15µs        ? ?/sec    1.00     75.1±0.13µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, mandatory, no NULLs                                            1.00     92.1±0.25µs        ? ?/sec    1.00     91.9±0.17µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, half NULLs                                           1.00    111.0±0.16µs        ? ?/sec    1.00    110.9±0.23µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, no NULLs                                             1.01     95.7±0.23µs        ? ?/sec    1.00     95.2±0.18µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, mandatory, no NULLs                                1.00     20.8±0.04µs        ? ?/sec    1.00     20.9±0.02µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, half NULLs                               1.01     74.9±0.12µs        ? ?/sec    1.00     74.3±0.21µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, no NULLs                                 1.00     24.3±0.03µs        ? ?/sec    1.00     24.2±0.02µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, mandatory, no NULLs                                       1.01     51.3±0.04µs        ? ?/sec    1.00     50.7±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, half NULLs                                      1.01     92.5±0.19µs        ? ?/sec    1.00     91.8±0.22µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, no NULLs                                        1.01     54.7±0.05µs        ? ?/sec    1.00     54.2±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, mandatory, no NULLs                                            1.01     13.8±0.05µs        ? ?/sec    1.00     13.7±0.04µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, half NULLs                                           1.01     72.3±0.17µs        ? ?/sec    1.00     71.4±0.16µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, no NULLs                                             1.00     17.4±0.02µs        ? ?/sec    1.01     17.5±0.04µs        ? ?/sec
arrow_array_reader/ListArray/Fixed32List/90pct NULLs                                                       1.00    879.1±1.14µs        ? ?/sec    1.00    881.6±1.06µs        ? ?/sec
arrow_array_reader/ListArray/Fixed32List/99pct NULLs                                                       1.00    448.7±4.21µs        ? ?/sec    1.01    451.8±3.17µs        ? ?/sec
arrow_array_reader/ListArray/Fixed32List/half NULLs                                                        1.00      2.2±0.01ms        ? ?/sec    1.00      2.2±0.00ms        ? ?/sec
arrow_array_reader/ListArray/Fixed32List/no NULLs                                                          1.04      3.1±0.01ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
arrow_array_reader/ListArray/Int32List/90pct NULLs                                                         1.01    868.9±0.98µs        ? ?/sec    1.00    863.2±1.00µs        ? ?/sec
arrow_array_reader/ListArray/Int32List/99pct NULLs                                                         1.00    447.3±4.43µs        ? ?/sec    1.00    446.3±4.26µs        ? ?/sec
arrow_array_reader/ListArray/Int32List/half NULLs                                                          1.00   1962.9±6.73µs        ? ?/sec    1.00   1962.1±3.77µs        ? ?/sec
arrow_array_reader/ListArray/Int32List/no NULLs                                                            1.00      2.7±0.01ms        ? ?/sec    1.00      2.7±0.00ms        ? ?/sec
arrow_array_reader/ListArray/Int32List/no NULLs or empty lists                                                                                    1.00   1920.2±1.43µs        ? ?/sec
arrow_array_reader/ListArray/StringList/90pct NULLs                                                        1.00    929.0±1.07µs        ? ?/sec    1.00    933.6±1.05µs        ? ?/sec
arrow_array_reader/ListArray/StringList/99pct NULLs                                                        1.00    456.1±5.12µs        ? ?/sec    1.00    456.0±3.90µs        ? ?/sec
arrow_array_reader/ListArray/StringList/half NULLs                                                         1.02      3.0±0.01ms        ? ?/sec    1.00      3.0±0.01ms        ? ?/sec
arrow_array_reader/ListArray/StringList/no NULLs                                                           1.03      5.0±0.02ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
arrow_array_reader/PlainStringToDictionary/high cardinality                                                1.00  1100.4±16.35µs        ? ?/sec    1.00  1097.0±10.10µs        ? ?/sec
arrow_array_reader/PlainStringToDictionary/low cardinality                                                 1.02  1041.4±14.82µs        ? ?/sec    1.00   1025.9±5.62µs        ? ?/sec
arrow_array_reader/PlainStringToDictionary/medium cardinality 1                                            1.00  1093.2±17.34µs        ? ?/sec    1.00   1095.7±8.73µs        ? ?/sec
arrow_array_reader/PlainStringToDictionary/medium cardinality 2                                            1.00  1050.6±15.71µs        ? ?/sec    1.00   1047.0±5.80µs        ? ?/sec
arrow_array_reader/StringArray/const delta byte array encoded, mandatory, no NULLs                         1.00    539.7±1.87µs        ? ?/sec    1.01    545.8±2.44µs        ? ?/sec
arrow_array_reader/StringArray/const delta length byte array encoded, mandatory, no NULLs                  1.03    215.7±0.81µs        ? ?/sec    1.00    210.4±0.54µs        ? ?/sec
arrow_array_reader/StringArray/const prefix delta byte array encoded, mandatory, no NULLs                  1.00   788.4±34.04µs        ? ?/sec    1.01   792.6±33.40µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, mandatory, no NULLs                                     1.00    284.5±0.16µs        ? ?/sec    1.00    284.8±0.17µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, half NULLs                                    1.03    392.6±0.79µs        ? ?/sec    1.00    381.3±0.55µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, no NULLs                                      1.03    283.1±0.14µs        ? ?/sec    1.00    274.0±0.11µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, mandatory, no NULLs                                          1.00    444.7±3.66µs        ? ?/sec    1.01    447.2±3.38µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, half NULLs                                         1.02    502.9±2.56µs        ? ?/sec    1.00    492.7±2.67µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, no NULLs                                           1.03    458.8±6.76µs        ? ?/sec    1.00    444.8±3.63µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, mandatory, no NULLs                                1.00    194.0±0.73µs        ? ?/sec    1.00    194.5±0.68µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, half NULLs                               1.00    245.3±0.59µs        ? ?/sec    1.00    244.4±0.51µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, no NULLs                                 1.00    197.8±0.63µs        ? ?/sec    1.00    197.6±0.67µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, mandatory, no NULLs                                 1.00     80.7±0.03µs        ? ?/sec    1.00     80.6±0.05µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, half NULLs                                1.00    111.9±0.15µs        ? ?/sec    1.00    112.0±0.13µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, no NULLs                                  1.00     84.6±0.05µs        ? ?/sec    1.00     84.6±0.06µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, mandatory, no NULLs                                      1.01    223.7±0.31µs        ? ?/sec    1.00    220.5±0.36µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, half NULLs                                     1.01    188.9±1.57µs        ? ?/sec    1.00    187.2±1.67µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, no NULLs                                       1.02    231.9±0.35µs        ? ?/sec    1.00    227.2±0.42µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed increasing value                                              1.00     54.7±0.62µs        ? ?/sec    1.01     55.2±0.57µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed single value                                                  1.02     47.4±0.49µs        ? ?/sec    1.00     46.5±0.61µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip increasing value                                         1.00     33.4±0.27µs        ? ?/sec    1.01     33.7±0.36µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip single value                                             1.02     29.5±0.24µs        ? ?/sec    1.00     29.0±0.31µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip stepped increasing value                                 1.00     58.0±0.26µs        ? ?/sec    1.00     58.2±0.10µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, mandatory, no NULLs                                     1.00     75.8±0.21µs        ? ?/sec    1.00     75.7±0.09µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, half NULLs                                    1.00     73.1±0.19µs        ? ?/sec    1.00     73.0±0.15µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, no NULLs                                      1.00     77.9±0.20µs        ? ?/sec    1.00     77.7±0.07µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed stepped increasing value                                      1.00     75.3±0.15µs        ? ?/sec    1.00     75.5±0.14µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, mandatory, no NULLs                                          1.00     97.2±0.14µs        ? ?/sec    1.00     97.5±0.11µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, half NULLs                                         1.01    115.4±0.23µs        ? ?/sec    1.00    114.6±0.23µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, no NULLs                                           1.00    101.2±0.12µs        ? ?/sec    1.00    100.9±0.15µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     20.9±0.03µs        ? ?/sec    1.01     21.1±0.02µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, half NULLs                             1.00     74.5±0.14µs        ? ?/sec    1.02     75.7±0.16µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, no NULLs                               1.00     24.3±0.02µs        ? ?/sec    1.01     24.5±0.02µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, mandatory, no NULLs                                     1.01     51.5±0.03µs        ? ?/sec    1.00     51.2±0.05µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, half NULLs                                    1.00     92.3±0.20µs        ? ?/sec    1.00     92.7±0.22µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, no NULLs                                      1.01     54.9±0.04µs        ? ?/sec    1.00     54.6±0.04µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, mandatory, no NULLs                                          1.00     13.8±0.06µs        ? ?/sec    1.01     13.9±0.03µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, half NULLs                                         1.01     72.8±0.14µs        ? ?/sec    1.00     71.9±0.28µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, no NULLs                                           1.00     17.5±0.05µs        ? ?/sec    1.01     17.6±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed increasing value                                              1.00     51.6±0.61µs        ? ?/sec    1.00     51.8±0.59µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed single value                                                  1.00     42.9±0.61µs        ? ?/sec    1.00     42.9±0.60µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip increasing value                                         1.00     31.8±0.36µs        ? ?/sec    1.01     32.0±0.36µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip single value                                             1.00     27.1±0.34µs        ? ?/sec    1.01     27.3±0.32µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip stepped increasing value                                 1.00     56.2±0.23µs        ? ?/sec    1.00     56.4±0.10µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, mandatory, no NULLs                                     1.00     71.2±0.98µs        ? ?/sec    1.00     71.3±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, half NULLs                                    1.01     69.8±0.50µs        ? ?/sec    1.00     69.4±0.17µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, no NULLs                                      1.00     73.2±0.99µs        ? ?/sec    1.00     73.0±0.14µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed stepped increasing value                                      1.00     71.9±0.12µs        ? ?/sec    1.00     71.9±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, mandatory, no NULLs                                          1.00     89.9±0.81µs        ? ?/sec    1.00     90.1±0.91µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, half NULLs                                         1.00    109.0±0.40µs        ? ?/sec    1.00    108.6±0.48µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, no NULLs                                           1.00     93.6±0.84µs        ? ?/sec    1.00     93.7±0.89µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     17.6±0.02µs        ? ?/sec    1.00     17.6±0.01µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, half NULLs                             1.00     71.8±0.17µs        ? ?/sec    1.00     71.7±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, no NULLs                               1.00     21.0±0.02µs        ? ?/sec    1.00     21.0±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, mandatory, no NULLs                                     1.01     48.2±0.03µs        ? ?/sec    1.00     47.9±0.02µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, half NULLs                                    1.00     89.3±0.16µs        ? ?/sec    1.00     89.0±0.17µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, no NULLs                                      1.01     51.8±0.03µs        ? ?/sec    1.00     51.2±0.04µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, mandatory, no NULLs                                          1.00     10.1±0.01µs        ? ?/sec    1.03     10.4±0.01µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, half NULLs                                         1.01     69.4±0.15µs        ? ?/sec    1.00     68.9±0.15µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, no NULLs                                           1.00     13.7±0.02µs        ? ?/sec    1.02     14.0±0.01µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed increasing value                                              1.00     41.9±0.13µs        ? ?/sec    1.00     41.9±0.14µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed single value                                                  1.00     38.5±0.08µs        ? ?/sec    1.00     38.5±0.08µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip increasing value                                         1.00     24.8±0.07µs        ? ?/sec    1.00     24.8±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip single value                                             1.01     23.0±0.05µs        ? ?/sec    1.00     22.9±0.04µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip stepped increasing value                                 1.00     49.0±0.06µs        ? ?/sec    1.00     49.2±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, mandatory, no NULLs                                     1.00     60.8±0.06µs        ? ?/sec    1.00     60.8±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, half NULLs                                    1.00     64.9±0.14µs        ? ?/sec    1.01     65.5±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, no NULLs                                      1.00     62.8±0.05µs        ? ?/sec    1.00     62.6±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed stepped increasing value                                      1.00     63.6±0.11µs        ? ?/sec    1.00     63.4±0.10µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, mandatory, no NULLs                                          1.00     78.2±0.14µs        ? ?/sec    1.00     77.8±0.14µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, half NULLs                                         1.00    104.0±0.25µs        ? ?/sec    1.01    104.7±0.25µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, no NULLs                                           1.00     82.1±0.15µs        ? ?/sec    1.00     81.8±0.12µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, mandatory, no NULLs                              1.00     45.8±0.06µs        ? ?/sec    1.01     46.2±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, half NULLs                             1.00     87.5±0.17µs        ? ?/sec    1.01     88.6±0.20µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, no NULLs                               1.00     49.8±0.05µs        ? ?/sec    1.00     49.7±0.03µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, mandatory, no NULLs                                     1.00     50.3±0.03µs        ? ?/sec    1.00     50.2±0.13µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, half NULLs                                    1.00     91.3±0.23µs        ? ?/sec    1.00     91.7±0.29µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, no NULLs                                      1.00     53.9±0.07µs        ? ?/sec    1.00     53.8±0.06µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, mandatory, no NULLs                                          1.03     17.0±0.03µs        ? ?/sec    1.00     16.4±0.01µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, half NULLs                                         1.00     72.8±0.21µs        ? ?/sec    1.02     74.2±0.21µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, no NULLs                                           1.02     20.5±0.02µs        ? ?/sec    1.00     20.1±0.02µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed increasing value                                               1.00     54.2±0.57µs        ? ?/sec    1.01     54.8±0.50µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed single value                                                   1.00     46.5±0.43µs        ? ?/sec    1.02     47.4±0.40µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip increasing value                                          1.00     33.1±0.26µs        ? ?/sec    1.01     33.5±0.34µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip single value                                              1.00     29.0±0.16µs        ? ?/sec    1.02     29.7±0.24µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip stepped increasing value                                  1.00     57.9±0.25µs        ? ?/sec    1.00     58.2±0.12µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, mandatory, no NULLs                                      1.00     75.3±0.38µs        ? ?/sec    1.00     75.6±0.23µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, half NULLs                                     1.00     72.3±0.22µs        ? ?/sec    1.00     72.5±0.16µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, no NULLs                                       1.00     77.3±0.34µs        ? ?/sec    1.00     77.5±0.20µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed stepped increasing value                                       1.00     75.0±0.15µs        ? ?/sec    1.00     75.3±0.15µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, mandatory, no NULLs                                           1.00     96.4±0.12µs        ? ?/sec    1.01     97.5±0.21µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, half NULLs                                          1.00    113.7±0.18µs        ? ?/sec    1.01    114.3±0.20µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, no NULLs                                            1.00     99.8±0.09µs        ? ?/sec    1.01    100.3±0.12µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, mandatory, no NULLs                               1.04     21.8±0.03µs        ? ?/sec    1.00     21.0±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, half NULLs                              1.01     75.7±0.14µs        ? ?/sec    1.00     74.7±0.18µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, no NULLs                                1.00     24.3±0.03µs        ? ?/sec    1.00     24.5±0.03µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, mandatory, no NULLs                                      1.01     51.3±0.05µs        ? ?/sec    1.00     50.8±0.05µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, half NULLs                                     1.00     92.7±0.22µs        ? ?/sec    1.00     92.4±0.15µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, no NULLs                                       1.00     54.9±0.04µs        ? ?/sec    1.00     54.8±0.05µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, mandatory, no NULLs                                           1.00     13.6±0.03µs        ? ?/sec    1.01     13.8±0.04µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, half NULLs                                          1.00     71.9±0.21µs        ? ?/sec    1.01     72.4±0.18µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, no NULLs                                            1.00     17.3±0.03µs        ? ?/sec    1.01     17.5±0.03µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, half NULLs            1.00     69.2±0.22µs        ? ?/sec    1.00     69.3±0.16µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, mandatory struct, optional data, no NULLs              1.00     13.7±0.05µs        ? ?/sec    1.01     13.8±0.01µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, half NULLs             1.00    129.1±0.17µs        ? ?/sec    1.00    129.0±0.13µs        ? ?/sec
arrow_array_reader/struct/Int32Array/plain encoded, optional struct, optional data, no NULLs               1.00     65.7±0.07µs        ? ?/sec    1.00     65.5±0.04µs        ? ?/sec

Per-runner information
arrow_reader — shard 1/1

Node: gk3-benchmark-cluster-nap-r1moxof8-92912e2d-p65f

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

uname:

Linux bench-c5981701915-3056-b2xhq 6.12.94+ #1 SMP Wed Aug 19 07:47:20 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader
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
Resource Usage

base (merge-base)

Metric Value
Wall time 2995.7s
Peak memory 190.1 MiB
Avg memory 44.2 MiB
CPU user 2980.8s
CPU sys 12.6s
Peak spill 0 B

branch

Metric Value
Wall time 3015.7s
Peak memory 181.5 MiB
Avg memory 41.2 MiB
CPU user 3002.0s
CPU sys 11.7s
Peak spill 0 B

File an issue against this benchmark runner

@alamb

alamb commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

@alamb This is a follow-up to #9848 and LGTM.

I would recommend we also add a test that alternates all-valid and null-containing chunks, with a transition at a non-byte-aligned bitmap offset so we cover the interaction between the new fast path and the existing filtering path.

Thanks @HippoBaro -- can you please make a PR with that test?

@alamb

alamb commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

I merged up from main so we can get bot confirmation of the performance improvement

@alamb

alamb commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_reader

env:
BENCH_FILTER: "ListArray/Int32List"

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark starting (GKE) | trigger

Target: arrow_reader

Sharding factor: 1 (1 workers).

Comparing neilc/fix-parquet-list-validity-regression (c8eba8c) to 103ebe7 (merge-base) diff

Run configuration
run benchmark arrow_reader
env:
  BENCH_FILTER: ListArray/Int32List
shards: 1

Results will be posted when all workers finish.


File an issue against this benchmark runner

@adriangbot

Copy link
Copy Markdown

🤖 Benchmark completed (GKE) | trigger

Target: arrow_reader

Comparing neilc/fix-parquet-list-validity-regression (c8eba8c) to 103ebe7 (merge-base) diff

Run configuration
run benchmark arrow_reader
env:
  BENCH_FILTER: ListArray/Int32List
shards: 1
Details
group                                                             base                                   changed
-----                                                             ----                                   -------
arrow_array_reader/ListArray/Int32List/90pct NULLs                1.00    863.0±0.91µs        ? ?/sec    1.00    861.0±0.83µs        ? ?/sec
arrow_array_reader/ListArray/Int32List/99pct NULLs                1.00    448.6±4.24µs        ? ?/sec    1.00    448.8±4.76µs        ? ?/sec
arrow_array_reader/ListArray/Int32List/half NULLs                 1.01   1965.4±4.96µs        ? ?/sec    1.00   1954.7±4.54µs        ? ?/sec
arrow_array_reader/ListArray/Int32List/no NULLs                   1.00      2.7±0.00ms        ? ?/sec    1.00      2.7±0.00ms        ? ?/sec
arrow_array_reader/ListArray/Int32List/no NULLs or empty lists    1.36      2.6±0.00ms        ? ?/sec    1.00   1908.9±2.21µs        ? ?/sec

Per-runner information
arrow_reader — shard 1/1

Node: gk3-benchmark-cluster-nap-4hvbnhcy-8466d65f-nr44

Instance: c4a-highcpu-48 (12 vCPU / 65 GiB)

uname:

Linux bench-c5998303491-3065-8qgvm 6.12.94+ #1 SMP Fri Aug 21 08:00:16 UTC 2026 aarch64 GNU/Linux

BENCH_COMMAND:

cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader
CPU Details (lscpu)
Architecture:                            aarch64
CPU op-mode(s):                          64-bit
Byte Order:                              Little Endian
CPU(s):                                  48
On-line CPU(s) list:                     0-47
Vendor ID:                               ARM
Model name:                              Neoverse-V2
Model:                                   1
Thread(s) per core:                      1
Core(s) per cluster:                     48
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:                               3 MiB (48 instances)
L1i cache:                               3 MiB (48 instances)
L2 cache:                                96 MiB (48 instances)
L3 cache:                                80 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-47
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
Resource Usage

base (merge-base)

Metric Value
Wall time 65.0s
Peak memory 118.9 MiB
Avg memory 106.1 MiB
CPU user 58.8s
CPU sys 0.1s
Peak spill 0 B

branch

Metric Value
Wall time 65.0s
Peak memory 119.1 MiB
Avg memory 111.6 MiB
CPU user 61.1s
CPU sys 0.0s
Peak spill 0 B

File an issue against this benchmark runner

@neilconway
neilconway force-pushed the neilc/fix-parquet-list-validity-regression branch from c8eba8c to 584b96e Compare October 5, 2026 18:06
@neilconway

Copy link
Copy Markdown
Contributor Author

@alamb @HippoBaro I took the liberty of adding the test that @HippoBaro suggested to this PR; let me know if you think it looks reasonable.

@alamb Looks like the benchmark bot results are what I'd expect for this optimization.

@alamb

alamb commented Oct 5, 2026

Copy link
Copy Markdown
Contributor

Looks great -- thank you @neilconway and @HippoBaro

@alamb
alamb enabled auto-merge October 5, 2026 23:22
@Jefffrey

Jefffrey commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

@alamb did you mean to approve & enable auto merge? 😅

@alamb

alamb commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

@alamb did you mean to approve & enable auto merge? 😅

Yes, sory about that

@alamb alamb left a comment •

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.

Thanks @neilconway and @HippoBaro -- the code looks fine to me

@alamb

alamb commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Sorry forgot to click submit

@alamb
alamb added this pull request to the merge queue Oct 7, 2026
@neilconway

Copy link
Copy Markdown
Contributor Author

@alamb The perf figure I mentioned didn't come from a real use-case. It comes from some local benchmark scripts I use to track UDF performance in DataFusion, and those store their data in Parquet.

@neilconway

Copy link
Copy Markdown
Contributor Author

Thanks for the reviews! @alamb @HippoBaro

Rich-T-kid pushed a commit to Rich-T-kid/arrow-rs that referenced this pull request Oct 7, 2026
… nulls (apache#11376)

# Which issue does this PR close?

- N/A

# Rationale for this change

Since apache#9848, reading the child column of a list builds a compact
validity bitmap with a pass over every definition level. When every
definition level in a chunk has the maximum value (i.e., there are no
null lists, empty lists, or null elements in any list), we can skip
doing the pass over the definition levels and append an all-valid run
instead.

Adding this pass caused a regression in list decoding performance
between 58.3.0 and 59.1.0: for example, 232 ms -> 289 ms to read 5M rows
with 62.5M values on an Apple M4 Max.

Benchmark for this case was added in apache#11375. Results on M4 Max:

- StringList/no NULLs: +0.7%, −0.6%, +0.9%
- StringList/half NULLs: +2.8%, +3.8%, +1.0%
- StringList/90pct NULLs: +2.7%, +0.5%, +0.9%
- StringList/99pct NULLs: +1.0%, +0.2%, +0.7%
- Int32List/no NULLs: +0.8%, −0.3%, −0.2%
- Int32List/half NULLs: +1.3%, −0.3%, +0.5%
- Int32List/90pct NULLs: +0.6%, −0.9%, −0.3%
- Int32List/99pct NULLs: +1.1%, −0.6%, +1.0%
- Int32List/no NULLs or empty lists: −18.4%, −19.9%, −18.5%
- Fixed32List/no NULLs: +1.2%, −0.8%, +1.1%
- Fixed32List/half NULLs: +1.6%, +0.8%, +2.1%
- Fixed32List/90pct NULLs: +0.4%, −0.5%, −0.5%
- Fixed32List/99pct NULLs: +0.2%, +0.4%, +0.9%

# What changes are included in this PR?

See above.

# Are these changes tested?

Covered by existing tests.

# Are there any significant user-facing changes?

No.

# AI usage

Developed and revised with Claude Code (Opus 5.5).
@alamb
alamb added this pull request to the merge queue Oct 7, 2026
Merged via the queue into apache:main with commit 36a7184 Oct 7, 2026
24 checks passed
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.

5 participants