Skip to content

[Parquet] perf: preallocate capacity for ArrayReaderBuilder#9093

Open
lyang24 wants to merge 5 commits intoapache:mainfrom
lyang24:pre_allocate_view_vec
Open

[Parquet] perf: preallocate capacity for ArrayReaderBuilder#9093
lyang24 wants to merge 5 commits intoapache:mainfrom
lyang24:pre_allocate_view_vec

Conversation

@lyang24
Copy link
Copy Markdown
Contributor

@lyang24 lyang24 commented Jan 3, 2026

Which issue does this PR close?

Rationale for this change

reduce allocation cost mentioned in #9059 from experiment: Pre-allocation overhead may offset the savings from avoiding incremental growth

What changes are included in this PR?

  • add with_capacity method to ValuesBuffer trait, and remove defaults to enforce the capacity hint is required for ArrayReaderBuilder.

  • The capacity hint will be passed down to GenericRecordReader to preallocate the buffer.

Are there any user-facing changes?

yes ArrayReaders needs an extra capacity variable to indicate the preferred batch size and we will provision buffer with this capacity.

@github-actions github-actions bot added the parquet Changes to the parquet crate label Jan 3, 2026
@lyang24 lyang24 force-pushed the pre_allocate_view_vec branch from 132b247 to e2b2b8f Compare January 3, 2026 10:01
@lyang24 lyang24 marked this pull request as draft January 3, 2026 14:05
@lyang24
Copy link
Copy Markdown
Contributor Author

lyang24 commented Jan 3, 2026

from experiment: Pre-allocation overhead may offset the savings from avoiding incremental growth

turning this into a draft

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 5, 2026

Thank you @lyang24 -- I will look at this more carefully shortly

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 9, 2026

I suspect we will not be able to detect the difference in an end to end test given how small of an overhead the allocation is compared to running the rest of the query

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 9, 2026

from experiment: Pre-allocation overhead may offset the savings from avoiding incremental growth

@lyang24 -- I am not sure that the num_rows you are passing in is actually the total number of rows which would be output. Looking at the internals of the reader, it almost looks like the record_reader doesn't currently get told how many records it may get -- however, the higher level APIs certainly know the max size (it is the batch_size)

Maybe we could pass in the batch size to the reader...

Edit: one way we could find out would be to put a println to print out the number of rows that was reserved 🤔

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 9, 2026

Update:

I made a small test program (below) and printed out the capacities

diff --git a/parquet/src/arrow/buffer/view_buffer.rs b/parquet/src/arrow/buffer/view_buffer.rs
index 0343047da6..d87b494b46 100644
--- a/parquet/src/arrow/buffer/view_buffer.rs
+++ b/parquet/src/arrow/buffer/view_buffer.rs
@@ -35,6 +35,7 @@ pub struct ViewBuffer {
 impl ViewBuffer {
     /// Create a new ViewBuffer with capacity for the specified number of views
     pub fn with_capacity(capacity: usize) -> Self {
+        println!("Creating ViewBuffer with capacity {}", capacity);
         Self {
             views: Vec::with_capacity(capacity),
             buffers: Vec::new(),

Here is what they are:

Creating ViewBuffer with capacity 4165
Creating ViewBuffer with capacity 10986
Creating ViewBuffer with capacity 9772
Creating ViewBuffer with capacity 35
Creating ViewBuffer with capacity 36
Creating ViewBuffer with capacity 26
Creating ViewBuffer with capacity 1
....
Creating ViewBuffer with capacity 32
Creating ViewBuffer with capacity 16
Creating ViewBuffer with capacity 218
Creating ViewBuffer with capacity 154
Creating ViewBuffer with capacity 154
Creating ViewBuffer with capacity 27

I think those are the number of rows in the dictionary (not the view themselves)

I also then printed out the actual capacites

diff --git a/parquet/src/arrow/array_reader/byte_view_array.rs b/parquet/src/arrow/array_reader/byte_view_array.rs
index 8e690c574d..3ea6f08a29 100644
--- a/parquet/src/arrow/array_reader/byte_view_array.rs
+++ b/parquet/src/arrow/array_reader/byte_view_array.rs
@@ -259,6 +259,8 @@ impl ByteViewArrayDecoder {
         len: usize,
         dict: Option<&ViewBuffer>,
     ) -> Result<usize> {
+        println!("ByteViewArrayDecoder::read called with len {}, current views capacity: {}", len, out.views.capacity());
+
         match self {
             ByteViewArrayDecoder::Plain(d) => d.read(out, len),
             ByteViewArrayDecoder::Dictionary(d) => {

You can actually see most of the reads have an empty buffer

ewArrayDecoder::read called with len 8192, current views capacity: 0
ByteViewArrayDecoder::read called with len 8192, current views capacity: 0
ByteViewArrayDecoder::read called with len 8192, current views capacity: 0
ByteViewArrayDecoder::read called with len 8192, current views capacity: 0
ByteViewArrayDecoder::read called with len 8192, current views capacity: 0
ByteViewArrayDecoder::read called with len 8192, current views capacity: 0
ByteViewArrayDecoder::read called with len 8192, current views capacity: 0
Read batch with 8192 rows and 105 columns
ByteViewArrayDecoder::read called with len 5120, current views capacity: 0
ByteViewArrayDecoder::read called with len 3072, current views capacity: 5120
ByteViewArrayDecoder::read called with len 6144, current views capacity: 0
ByteViewArrayDecoder::read called with len 2048, current views capacity: 6144

I tracked it down in a debugger and the default buffer is being created here:

https://github.com/apache/arrow-rs/blob/02fa779a9cb122c5218293be3afb980832701683/parquet/src/arrow/record_reader/mod.rs#L76-L75

Whole Test Progarm

use std::fs::File;
use std::io::{BufReader, Read};
use std::sync::Arc;
use arrow::datatypes::{DataType, Field, FieldRef, Schema};
use parquet::arrow::arrow_reader::{ArrowReaderOptions, ParquetRecordBatchReaderBuilder};
use bytes::Bytes;
use parquet::file::metadata::ParquetMetaDataReader;

fn main() {
    let file_name = "/Users/andrewlamb/Downloads/hits/hits_0.parquet";
    println!("Opening file: {file_name}", );
    let mut file = File::open(file_name).unwrap();
    let mut bytes = Vec::new();
    file.read_to_end(&mut bytes).unwrap();
    let bytes = Bytes::from(bytes);

    let schema = string_to_view_types(ParquetRecordBatchReaderBuilder::try_new(bytes.clone()).unwrap().schema());

    //println!("Schema: {:?}", schema);

    let options = ArrowReaderOptions::new()
        .with_schema(schema);
    let reader = ParquetRecordBatchReaderBuilder::try_new_with_options(bytes, options).unwrap()
        .with_batch_size(8192)
        .build().unwrap();

    for batch in reader {
        let batch = batch.unwrap();
        println!("Read batch with {} rows and {} columns", batch.num_rows(), batch.num_columns());
    }

    println!("Done");


}


// Hack because the clickbench files were written with the wrong logical type for strings
fn string_to_view_types(schema: &Arc<Schema>) -> Arc<Schema> {
    let fields: Vec<FieldRef> = schema
        .fields()
        .iter()
        .map(|field| {
            let existing_type = field.data_type();
            if existing_type == &DataType::Utf8 || existing_type == &DataType::Binary {
                Arc::new(Field::new(
                    field.name(),
                    DataType::Utf8View,
                    field.is_nullable(),
                ))
            } else {
                Arc::clone(field)
            }
        })
        .collect();
    Arc::new(Schema::new(fields))
}

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 9, 2026

So, TLDR is my analyis is that we aren't properly sizing the allocations. The good news is we can fix this. The bad news is it may be tricky. I will update the original ticket too

@lyang24
Copy link
Copy Markdown
Contributor Author

lyang24 commented Jan 11, 2026

So, TLDR is my analyis is that we aren't properly sizing the allocations. The good news is we can fix this. The bad news is it may be tricky. I will update the original ticket too

Thanks for the deep dive, i think passing down a capacity hint from ArrayReaderBuilder is the right way to go. I made a impl attempt - and results looks promising.
clickbench query 10 no predicate pushdown

Run Original Arrow-rs (ms) Patched Arrow-rs (ms)
1 (cold) 174 181
2 115 109
3 113 107
4 114 103
5 115 111
6 118 110
Avg (warm) 115 108

with predicate pushdown the sql runs so fast (7ms) the difference become hard to tell
SET datafusion.execution.parquet.pushdown_filters = true;

@lyang24 lyang24 force-pushed the pre_allocate_view_vec branch from 224798a to 72f35ad Compare January 11, 2026 07:17
@lyang24 lyang24 changed the title Minor: pre allocate view vec parquet: preallocate capacity for ArrayReaderBuilder Jan 11, 2026
@lyang24 lyang24 force-pushed the pre_allocate_view_vec branch from 72f35ad to a4f04e7 Compare January 11, 2026 07:29
@lyang24 lyang24 changed the title parquet: preallocate capacity for ArrayReaderBuilder [parquet] perf: preallocate capacity for ArrayReaderBuilder Jan 11, 2026
@lyang24 lyang24 changed the title [parquet] perf: preallocate capacity for ArrayReaderBuilder [Parquet] perf: preallocate capacity for ArrayReaderBuilder Jan 11, 2026
@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 11, 2026

Nice -- checking it out

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 11, 2026

run benchmark arrow_reader arrow_reader_row_filter arrow_reader_clickbench

@alamb-ghbot
Copy link
Copy Markdown

🤖 ./gh_compare_arrow.sh gh_compare_arrow.sh Running
Linux aal-dev 6.14.0-1018-gcp #19~24.04.1-Ubuntu SMP Wed Sep 24 23:23:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Comparing pre_allocate_view_vec (a4f04e7) to 843bee2 diff
BENCH_NAME=arrow_reader
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental --bench arrow_reader
BENCH_FILTER=
BENCH_BRANCH_NAME=pre_allocate_view_vec
Results will be posted here when complete

Copy link
Copy Markdown
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

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

Thanks @lyang24 -- this looks very nice. I kicked off some automated benchmarks and hopefully we can see the benefits reflected there (though the benchmarks are sometimes pretty noisy)

If this does work out, I would like to spend a bit more time trying to get this mechanism to work by removing Default from ValuesBuffer to ensure we got all the cases and that any future array readers work the same

Comment thread parquet/src/arrow/array_reader/builder.rs Outdated
Comment thread parquet/src/arrow/record_reader/buffer.rs Outdated
@alamb-ghbot
Copy link
Copy Markdown

🤖: Benchmark completed

Details

group                                                                                                      main                                   pre_allocate_view_vec
-----                                                                                                      ----                                   ---------------------
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                           1.00   1212.4±5.70µs        ? ?/sec    1.05  1269.4±26.62µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                          1.00   1245.0±9.07µs        ? ?/sec    1.03   1283.0±9.24µs        ? ?/sec
arrow_array_reader/BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                            1.00   1219.0±6.42µs        ? ?/sec    1.05   1274.3±9.67µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, mandatory, no NULLs                                     1.06    516.1±5.19µs        ? ?/sec    1.00    485.8±5.31µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, half NULLs                                    1.05   678.5±29.39µs        ? ?/sec    1.00    649.2±8.81µs        ? ?/sec
arrow_array_reader/BinaryArray/dictionary encoded, optional, no NULLs                                      1.05   518.3±38.16µs        ? ?/sec    1.00   493.8±15.22µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, mandatory, no NULLs                                          1.00   543.0±11.34µs        ? ?/sec    1.03   558.4±11.03µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, half NULLs                                         1.01    721.6±4.50µs        ? ?/sec    1.00    715.7±3.51µs        ? ?/sec
arrow_array_reader/BinaryArray/plain encoded, optional, no NULLs                                           1.00    555.1±7.88µs        ? ?/sec    1.02    566.2±3.63µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, mandatory, no NULLs                                 1.43    283.9±5.35µs        ? ?/sec    1.00    198.5±1.16µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, half NULLs                                1.41    271.3±5.18µs        ? ?/sec    1.00    192.4±1.73µs        ? ?/sec
arrow_array_reader/BinaryViewArray/dictionary encoded, optional, no NULLs                                  1.43    289.2±3.59µs        ? ?/sec    1.00    202.8±1.54µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs                                      1.07   293.5±17.90µs        ? ?/sec    1.00    275.0±1.96µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, mandatory, no NULLs, short string                        1.05    283.3±3.78µs        ? ?/sec    1.00    270.4±5.16µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, half NULLs                                     1.24    288.6±6.93µs        ? ?/sec    1.00    232.8±3.73µs        ? ?/sec
arrow_array_reader/BinaryViewArray/plain encoded, optional, no NULLs                                       1.07    302.6±5.83µs        ? ?/sec    1.00    283.6±4.65µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs     1.02  1085.8±15.34µs        ? ?/sec    1.00   1067.4±6.77µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, half NULLs    1.01    947.4±7.50µs        ? ?/sec    1.00    936.8±8.25µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/byte_stream_split encoded, optional, no NULLs      1.01   1081.8±6.63µs        ? ?/sec    1.00  1075.6±17.88µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, mandatory, no NULLs                 1.02    403.1±6.69µs        ? ?/sec    1.00    394.3±9.57µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, half NULLs                1.01   591.1±10.10µs        ? ?/sec    1.00   583.8±13.65µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Decimal128Array/plain encoded, optional, no NULLs                  1.03   409.2±11.21µs        ? ?/sec    1.00    399.0±9.89µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, mandatory, no NULLs        1.00    160.8±1.25µs        ? ?/sec    1.00    160.2±0.99µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, half NULLs       1.00    275.6±3.47µs        ? ?/sec    1.04    286.7±2.81µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/byte_stream_split encoded, optional, no NULLs         1.02   169.7±21.23µs        ? ?/sec    1.00    165.8±0.99µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, mandatory, no NULLs                    1.00     76.1±1.03µs        ? ?/sec    1.02     77.6±6.10µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, half NULLs                   1.00    232.2±1.57µs        ? ?/sec    1.05    244.0±1.49µs        ? ?/sec
arrow_array_reader/FIXED_LEN_BYTE_ARRAY/Float16Array/plain encoded, optional, no NULLs                     1.00     81.1±1.29µs        ? ?/sec    1.02     82.3±0.81µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, mandatory, no NULLs                    1.00   746.2±88.38µs        ? ?/sec    1.00    744.9±8.47µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, half NULLs                   1.02    594.6±8.24µs        ? ?/sec    1.00    582.7±9.00µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/byte_stream_split encoded, optional, no NULLs                     1.00   742.2±17.93µs        ? ?/sec    1.01    750.3±4.99µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, mandatory, no NULLs                                1.00     58.8±4.84µs        ? ?/sec    1.23     72.4±3.38µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, half NULLs                               1.00    255.1±2.11µs        ? ?/sec    1.00    254.2±1.99µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(16)/plain encoded, optional, no NULLs                                 1.00     68.4±4.73µs        ? ?/sec    1.14     78.0±2.84µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, mandatory, no NULLs                     1.01     94.7±5.73µs        ? ?/sec    1.00     93.8±0.32µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, half NULLs                    1.00    208.2±1.91µs        ? ?/sec    1.04    217.1±4.91µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/byte_stream_split encoded, optional, no NULLs                      1.01     99.2±1.41µs        ? ?/sec    1.00     98.6±0.73µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, mandatory, no NULLs                                 1.00      9.0±0.14µs        ? ?/sec    1.04      9.4±0.40µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, half NULLs                                1.00    164.5±1.65µs        ? ?/sec    1.06    174.1±1.39µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(2)/plain encoded, optional, no NULLs                                  1.01     14.4±0.23µs        ? ?/sec    1.00     14.2±0.27µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, mandatory, no NULLs                     1.00    184.8±1.35µs        ? ?/sec    1.00    184.5±1.81µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, half NULLs                    1.00    329.5±2.90µs        ? ?/sec    1.02    337.4±7.36µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/byte_stream_split encoded, optional, no NULLs                      1.00    189.8±2.09µs        ? ?/sec    1.00    189.9±2.43µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, mandatory, no NULLs                                 1.00     14.0±0.33µs        ? ?/sec    1.12     15.6±0.51µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, half NULLs                                1.00    245.5±3.53µs        ? ?/sec    1.04    254.1±5.91µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(4)/plain encoded, optional, no NULLs                                  1.00     19.9±0.50µs        ? ?/sec    1.01     20.0±0.44µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, mandatory, no NULLs                     1.00    366.5±6.38µs        ? ?/sec    1.00    367.0±2.68µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, half NULLs                    1.00    388.2±3.29µs        ? ?/sec    1.00    387.6±2.33µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/byte_stream_split encoded, optional, no NULLs                      1.00    371.1±3.09µs        ? ?/sec    1.01   375.7±16.29µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, mandatory, no NULLs                                 1.00     26.8±0.36µs        ? ?/sec    1.01     27.1±0.70µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, half NULLs                                1.01    219.1±1.57µs        ? ?/sec    1.00    217.0±1.17µs        ? ?/sec
arrow_array_reader/FixedLenByteArray(8)/plain encoded, optional, no NULLs                                  1.00     33.6±0.32µs        ? ?/sec    1.00     33.7±0.73µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.00    110.3±0.37µs        ? ?/sec    1.00    110.1±0.38µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, half NULLs                          1.03    130.3±4.92µs        ? ?/sec    1.00    126.7±2.40µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed skip, optional, no NULLs                            1.01    113.6±0.98µs        ? ?/sec    1.00    112.7±1.05µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, mandatory, no NULLs                                1.03   164.1±14.03µs        ? ?/sec    1.00    159.3±1.51µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, half NULLs                               1.03    222.2±3.38µs        ? ?/sec    1.00    215.6±3.32µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/binary packed, optional, no NULLs                                 1.02    168.2±4.98µs        ? ?/sec    1.00    165.3±1.71µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.06     77.2±0.90µs        ? ?/sec    1.00     73.0±0.65µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.03    174.9±2.97µs        ? ?/sec    1.00    169.7±3.45µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.09     84.5±3.00µs        ? ?/sec    1.00     77.8±0.64µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.00    136.1±3.51µs        ? ?/sec    1.06    144.8±6.56µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, half NULLs                          1.03   217.6±30.82µs        ? ?/sec    1.00   211.6±19.40µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/dictionary encoded, optional, no NULLs                            1.00    143.1±4.82µs        ? ?/sec    1.04    148.2±1.71µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, mandatory, no NULLs                                1.06     74.1±0.44µs        ? ?/sec    1.00     69.9±0.16µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, half NULLs                               1.04    172.8±1.32µs        ? ?/sec    1.00    166.5±1.46µs        ? ?/sec
arrow_array_reader/INT32/Decimal128Array/plain encoded, optional, no NULLs                                 1.06     77.6±0.40µs        ? ?/sec    1.00     73.1±0.26µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, mandatory, no NULLs                           1.03    109.6±1.42µs        ? ?/sec    1.00    105.9±0.42µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, half NULLs                          1.04    133.2±2.17µs        ? ?/sec    1.00    128.6±3.72µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed skip, optional, no NULLs                            1.05    113.5±3.73µs        ? ?/sec    1.00    108.2±0.46µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, mandatory, no NULLs                                1.04    163.0±4.66µs        ? ?/sec    1.00    156.8±1.82µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, half NULLs                               1.04    229.5±1.98µs        ? ?/sec    1.00    220.9±1.22µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/binary packed, optional, no NULLs                                 1.04    168.3±0.86µs        ? ?/sec    1.00    162.0±2.30µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, mandatory, no NULLs                    1.03    203.9±3.06µs        ? ?/sec    1.00    198.2±1.90µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, half NULLs                   1.05    246.8±3.32µs        ? ?/sec    1.00    235.8±3.82µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/byte_stream_split encoded, optional, no NULLs                     1.03    209.7±2.62µs        ? ?/sec    1.00    203.5±0.47µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, mandatory, no NULLs                           1.08    153.9±1.82µs        ? ?/sec    1.00    142.8±1.34µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, half NULLs                          1.06    224.7±1.62µs        ? ?/sec    1.00    212.4±1.01µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/dictionary encoded, optional, no NULLs                            1.08    159.3±2.13µs        ? ?/sec    1.00    147.0±0.59µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, mandatory, no NULLs                                1.23    103.2±1.30µs        ? ?/sec    1.00     83.8±0.29µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, half NULLs                               1.07    194.3±0.93µs        ? ?/sec    1.00    181.8±2.33µs        ? ?/sec
arrow_array_reader/INT64/Decimal128Array/plain encoded, optional, no NULLs                                 1.23    114.5±0.56µs        ? ?/sec    1.00     93.1±1.05µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, mandatory, no NULLs                                      1.00     78.4±0.65µs        ? ?/sec    1.00     78.7±1.05µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, half NULLs                                     1.04    104.4±0.67µs        ? ?/sec    1.00    100.9±0.52µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed skip, optional, no NULLs                                       1.00     81.0±0.30µs        ? ?/sec    1.00     81.1±1.85µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, mandatory, no NULLs                                           1.01    108.9±0.83µs        ? ?/sec    1.00    108.0±0.50µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, half NULLs                                          1.04    176.4±1.20µs        ? ?/sec    1.00    169.8±1.91µs        ? ?/sec
arrow_array_reader/Int16Array/binary packed, optional, no NULLs                                            1.01    114.2±2.57µs        ? ?/sec    1.00    112.5±2.36µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, mandatory, no NULLs                               1.07     43.9±0.35µs        ? ?/sec    1.00     41.1±0.32µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, half NULLs                              1.05    140.7±7.27µs        ? ?/sec    1.00    134.5±1.42µs        ? ?/sec
arrow_array_reader/Int16Array/byte_stream_split encoded, optional, no NULLs                                1.06     48.1±0.40µs        ? ?/sec    1.00     45.2±0.11µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, mandatory, no NULLs                                      1.00    102.4±1.37µs        ? ?/sec    1.09    111.4±4.11µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, half NULLs                                     1.00    174.5±0.66µs        ? ?/sec    1.00    174.4±1.89µs        ? ?/sec
arrow_array_reader/Int16Array/dictionary encoded, optional, no NULLs                                       1.00    107.5±1.48µs        ? ?/sec    1.08    115.9±0.79µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, mandatory, no NULLs                                           1.07     37.8±0.15µs        ? ?/sec    1.00     35.3±0.40µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, half NULLs                                          1.04    137.0±0.89µs        ? ?/sec    1.00    132.1±2.89µs        ? ?/sec
arrow_array_reader/Int16Array/plain encoded, optional, no NULLs                                            1.07     42.4±0.27µs        ? ?/sec    1.00     39.5±0.19µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, mandatory, no NULLs                                      1.01     84.9±0.37µs        ? ?/sec    1.00     84.2±0.50µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, half NULLs                                     1.03    103.8±2.24µs        ? ?/sec    1.00    101.1±1.19µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed skip, optional, no NULLs                                       1.01     88.0±0.73µs        ? ?/sec    1.00     86.9±1.03µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, mandatory, no NULLs                                           1.02    111.4±2.69µs        ? ?/sec    1.00    109.3±2.16µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, half NULLs                                          1.03    168.9±2.35µs        ? ?/sec    1.00   164.4±12.63µs        ? ?/sec
arrow_array_reader/Int32Array/binary packed, optional, no NULLs                                            1.02    116.0±2.24µs        ? ?/sec    1.00    113.3±1.11µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, mandatory, no NULLs                               1.19     26.5±0.38µs        ? ?/sec    1.00     22.2±0.08µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, half NULLs                              1.07   124.8±11.81µs        ? ?/sec    1.00    117.2±3.11µs        ? ?/sec
arrow_array_reader/Int32Array/byte_stream_split encoded, optional, no NULLs                                1.17     30.9±0.31µs        ? ?/sec    1.00     26.3±0.09µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, mandatory, no NULLs                                      1.00     85.3±1.09µs        ? ?/sec    1.10     93.8±0.38µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, half NULLs                                     1.00    156.8±3.00µs        ? ?/sec    1.00    157.2±2.56µs        ? ?/sec
arrow_array_reader/Int32Array/dictionary encoded, optional, no NULLs                                       1.00     90.0±0.44µs        ? ?/sec    1.08     97.5±1.89µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, mandatory, no NULLs                                           1.00     18.2±0.78µs        ? ?/sec    1.04     18.9±2.04µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, half NULLs                                          1.05    119.8±0.48µs        ? ?/sec    1.00    114.2±1.72µs        ? ?/sec
arrow_array_reader/Int32Array/plain encoded, optional, no NULLs                                            1.02     24.4±0.46µs        ? ?/sec    1.00     24.0±1.99µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, mandatory, no NULLs                                      1.04     81.5±0.41µs        ? ?/sec    1.00     78.3±1.13µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, half NULLs                                     1.03    103.2±4.49µs        ? ?/sec    1.00     99.9±1.54µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed skip, optional, no NULLs                                       1.03     84.5±0.74µs        ? ?/sec    1.00     81.9±0.86µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, mandatory, no NULLs                                           1.04    108.0±0.70µs        ? ?/sec    1.00    104.0±0.85µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, half NULLs                                          1.06    174.7±0.95µs        ? ?/sec    1.00    164.8±1.86µs        ? ?/sec
arrow_array_reader/Int64Array/binary packed, optional, no NULLs                                            1.07    115.9±1.40µs        ? ?/sec    1.00    108.3±0.37µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, mandatory, no NULLs                               1.05    151.5±1.08µs        ? ?/sec    1.00    143.8±1.06µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, half NULLs                              1.06    193.4±1.03µs        ? ?/sec    1.00    182.0±1.16µs        ? ?/sec
arrow_array_reader/Int64Array/byte_stream_split encoded, optional, no NULLs                                1.06    157.2±1.24µs        ? ?/sec    1.00    148.5±1.05µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, mandatory, no NULLs                                      1.13    100.9±1.60µs        ? ?/sec    1.00     89.5±1.00µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, half NULLs                                     1.09    172.9±2.43µs        ? ?/sec    1.00    158.5±1.16µs        ? ?/sec
arrow_array_reader/Int64Array/dictionary encoded, optional, no NULLs                                       1.13    105.8±1.57µs        ? ?/sec    1.00     93.8±0.68µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, mandatory, no NULLs                                           1.18     46.3±2.63µs        ? ?/sec    1.00     39.1±4.31µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, half NULLs                                          1.09    136.6±6.25µs        ? ?/sec    1.00    124.9±1.14µs        ? ?/sec
arrow_array_reader/Int64Array/plain encoded, optional, no NULLs                                            1.35     56.5±3.13µs        ? ?/sec    1.00     41.9±4.03µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, mandatory, no NULLs                                       1.00     82.5±0.89µs        ? ?/sec    1.01     82.9±1.45µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, half NULLs                                      1.03    104.1±0.68µs        ? ?/sec    1.00    101.4±0.60µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed skip, optional, no NULLs                                        1.00     85.8±0.93µs        ? ?/sec    1.00     85.5±1.53µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, mandatory, no NULLs                                            1.00    110.8±0.69µs        ? ?/sec    1.03    113.7±2.94µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, half NULLs                                           1.03    173.6±3.56µs        ? ?/sec    1.00    168.1±0.71µs        ? ?/sec
arrow_array_reader/Int8Array/binary packed, optional, no NULLs                                             1.00    115.8±0.33µs        ? ?/sec    1.02    117.9±1.08µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, mandatory, no NULLs                                1.11     36.2±0.12µs        ? ?/sec    1.00     32.6±0.31µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, half NULLs                               1.05    133.5±1.05µs        ? ?/sec    1.00    126.7±2.01µs        ? ?/sec
arrow_array_reader/Int8Array/byte_stream_split encoded, optional, no NULLs                                 1.06     38.7±0.43µs        ? ?/sec    1.00     36.5±0.16µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, mandatory, no NULLs                                       1.00     94.7±0.63µs        ? ?/sec    1.09    103.5±0.86µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, half NULLs                                      1.01    167.4±0.94µs        ? ?/sec    1.00    166.6±4.95µs        ? ?/sec
arrow_array_reader/Int8Array/dictionary encoded, optional, no NULLs                                        1.00     99.8±0.66µs        ? ?/sec    1.08    107.6±1.39µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, mandatory, no NULLs                                            1.11     30.0±0.30µs        ? ?/sec    1.00     27.2±0.09µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, half NULLs                                           1.05    130.5±3.18µs        ? ?/sec    1.00    124.2±1.38µs        ? ?/sec
arrow_array_reader/Int8Array/plain encoded, optional, no NULLs                                             1.09     34.7±0.27µs        ? ?/sec    1.00     31.7±0.39µs        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings half NULLs                                     1.00      7.4±0.04ms        ? ?/sec    1.02      7.5±0.03ms        ? ?/sec
arrow_array_reader/ListArray/plain encoded optional strings no NULLs                                       1.00     12.9±0.21ms        ? ?/sec    1.01     13.0±0.11ms        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, mandatory, no NULLs                                     1.04    515.0±8.50µs        ? ?/sec    1.00    493.8±4.34µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, half NULLs                                    1.04   676.0±12.30µs        ? ?/sec    1.00    648.5±8.64µs        ? ?/sec
arrow_array_reader/StringArray/dictionary encoded, optional, no NULLs                                      1.03    510.8±6.02µs        ? ?/sec    1.00    493.9±6.27µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, mandatory, no NULLs                                          1.00   692.6±25.06µs        ? ?/sec    1.03    712.3±3.23µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, half NULLs                                         1.01    797.9±5.75µs        ? ?/sec    1.00   790.0±12.93µs        ? ?/sec
arrow_array_reader/StringArray/plain encoded, optional, no NULLs                                           1.00    694.3±5.08µs        ? ?/sec    1.04    720.6±3.30µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, mandatory, no NULLs                                1.01   340.8±12.05µs        ? ?/sec    1.00    336.1±3.16µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, half NULLs                               1.09    421.8±1.99µs        ? ?/sec    1.00   387.5±10.26µs        ? ?/sec
arrow_array_reader/StringDictionary/dictionary encoded, optional, no NULLs                                 1.01    344.9±3.72µs        ? ?/sec    1.00    341.8±5.57µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, mandatory, no NULLs                                 1.39    276.2±3.61µs        ? ?/sec    1.00    198.9±3.70µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, half NULLs                                1.37    264.1±7.83µs        ? ?/sec    1.00    193.4±2.22µs        ? ?/sec
arrow_array_reader/StringViewArray/dictionary encoded, optional, no NULLs                                  1.37    279.0±4.04µs        ? ?/sec    1.00    203.5±2.35µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, mandatory, no NULLs                                      1.01   454.1±11.39µs        ? ?/sec    1.00    450.5±6.65µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, half NULLs                                     1.16   375.1±43.51µs        ? ?/sec    1.00    322.6±7.97µs        ? ?/sec
arrow_array_reader/StringViewArray/plain encoded, optional, no NULLs                                       1.01    463.8±8.70µs        ? ?/sec    1.00    457.0±3.62µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, mandatory, no NULLs                                     1.00     94.4±1.12µs        ? ?/sec    1.05     99.2±0.75µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, half NULLs                                    1.00    112.4±0.37µs        ? ?/sec    1.01    113.2±0.47µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed skip, optional, no NULLs                                      1.00     96.7±1.52µs        ? ?/sec    1.06    102.1±0.47µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, mandatory, no NULLs                                          1.00    129.2±4.20µs        ? ?/sec    1.04    134.3±0.92µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, half NULLs                                         1.01    187.8±0.97µs        ? ?/sec    1.00    185.9±2.13µs        ? ?/sec
arrow_array_reader/UInt16Array/binary packed, optional, no NULLs                                           1.00    133.4±0.62µs        ? ?/sec    1.04    139.4±4.83µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, mandatory, no NULLs                              1.04     41.8±0.13µs        ? ?/sec    1.00     40.4±0.50µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, half NULLs                             1.04    140.0±1.77µs        ? ?/sec    1.00    134.5±2.05µs        ? ?/sec
arrow_array_reader/UInt16Array/byte_stream_split encoded, optional, no NULLs                               1.05     46.6±1.03µs        ? ?/sec    1.00     44.5±0.12µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, mandatory, no NULLs                                     1.00    102.2±0.92µs        ? ?/sec    1.10    112.5±3.07µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, half NULLs                                    1.00    174.1±2.96µs        ? ?/sec    1.00    174.4±1.27µs        ? ?/sec
arrow_array_reader/UInt16Array/dictionary encoded, optional, no NULLs                                      1.00    107.5±0.90µs        ? ?/sec    1.08    116.0±2.20µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, mandatory, no NULLs                                          1.08     37.9±0.20µs        ? ?/sec    1.00     35.2±0.34µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, half NULLs                                         1.05    139.0±2.64µs        ? ?/sec    1.00    132.1±3.16µs        ? ?/sec
arrow_array_reader/UInt16Array/plain encoded, optional, no NULLs                                           1.08     42.7±0.16µs        ? ?/sec    1.00     39.4±0.16µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, mandatory, no NULLs                                     1.01     85.1±1.51µs        ? ?/sec    1.00     83.9±0.93µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, half NULLs                                    1.03    103.7±1.37µs        ? ?/sec    1.00    100.4±0.90µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed skip, optional, no NULLs                                      1.01     87.6±1.27µs        ? ?/sec    1.00     86.8±2.30µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, mandatory, no NULLs                                          1.02    112.5±1.64µs        ? ?/sec    1.00    109.8±1.15µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, half NULLs                                         1.04    169.5±3.20µs        ? ?/sec    1.00    163.5±1.89µs        ? ?/sec
arrow_array_reader/UInt32Array/binary packed, optional, no NULLs                                           1.03    117.6±0.85µs        ? ?/sec    1.00    113.8±0.32µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, mandatory, no NULLs                              1.16     26.9±0.41µs        ? ?/sec    1.00     23.2±0.20µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, half NULLs                             1.07   124.4±10.00µs        ? ?/sec    1.00    116.6±1.32µs        ? ?/sec
arrow_array_reader/UInt32Array/byte_stream_split encoded, optional, no NULLs                               1.13     31.0±0.48µs        ? ?/sec    1.00     27.4±1.08µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, mandatory, no NULLs                                     1.00     86.9±5.28µs        ? ?/sec    1.07     92.7±0.55µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, half NULLs                                    1.00    157.2±1.45µs        ? ?/sec    1.00    157.1±2.71µs        ? ?/sec
arrow_array_reader/UInt32Array/dictionary encoded, optional, no NULLs                                      1.00     90.3±0.64µs        ? ?/sec    1.08     97.6±1.95µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, mandatory, no NULLs                                          1.15     21.2±1.02µs        ? ?/sec    1.00     18.5±1.46µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, half NULLs                                         1.05    120.0±0.49µs        ? ?/sec    1.00    114.4±1.23µs        ? ?/sec
arrow_array_reader/UInt32Array/plain encoded, optional, no NULLs                                           1.12     26.2±1.32µs        ? ?/sec    1.00     23.5±1.81µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, mandatory, no NULLs                                     1.04     81.4±0.37µs        ? ?/sec    1.00     78.4±0.49µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, half NULLs                                    1.03    103.2±0.36µs        ? ?/sec    1.00    100.1±2.44µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed skip, optional, no NULLs                                      1.04     84.3±0.98µs        ? ?/sec    1.00     80.7±0.66µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, mandatory, no NULLs                                          1.06    109.8±1.39µs        ? ?/sec    1.00    103.4±2.15µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, half NULLs                                         1.07    177.0±2.60µs        ? ?/sec    1.00    166.0±0.76µs        ? ?/sec
arrow_array_reader/UInt64Array/binary packed, optional, no NULLs                                           1.07    116.0±1.93µs        ? ?/sec    1.00    108.2±1.01µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, mandatory, no NULLs                              1.05    151.3±0.65µs        ? ?/sec    1.00    143.7±0.77µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, half NULLs                             1.06    193.6±3.98µs        ? ?/sec    1.00    182.9±1.23µs        ? ?/sec
arrow_array_reader/UInt64Array/byte_stream_split encoded, optional, no NULLs                               1.05    156.4±0.99µs        ? ?/sec    1.00    149.3±4.42µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, mandatory, no NULLs                                     1.11    100.7±0.65µs        ? ?/sec    1.00     90.4±5.87µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, half NULLs                                    1.09    172.8±0.73µs        ? ?/sec    1.00    158.7±3.31µs        ? ?/sec
arrow_array_reader/UInt64Array/dictionary encoded, optional, no NULLs                                      1.13    105.8±1.31µs        ? ?/sec    1.00     93.9±0.41µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, mandatory, no NULLs                                          1.25     46.2±2.73µs        ? ?/sec    1.00     36.9±4.04µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, half NULLs                                         1.10    138.0±2.69µs        ? ?/sec    1.00    125.3±0.64µs        ? ?/sec
arrow_array_reader/UInt64Array/plain encoded, optional, no NULLs                                           1.22     55.1±2.76µs        ? ?/sec    1.00     45.0±5.42µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, mandatory, no NULLs                                      1.01     89.9±2.44µs        ? ?/sec    1.00     89.1±0.36µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, half NULLs                                     1.03    107.9±1.15µs        ? ?/sec    1.00    104.8±1.33µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed skip, optional, no NULLs                                       1.00     92.7±1.03µs        ? ?/sec    1.00     92.4±4.00µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, mandatory, no NULLs                                           1.01    120.5±1.30µs        ? ?/sec    1.00    119.2±0.52µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, half NULLs                                          1.04    178.6±3.14µs        ? ?/sec    1.00    172.0±2.36µs        ? ?/sec
arrow_array_reader/UInt8Array/binary packed, optional, no NULLs                                            1.02    125.9±3.14µs        ? ?/sec    1.00    123.5±0.50µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, mandatory, no NULLs                               1.10     36.1±1.02µs        ? ?/sec    1.00     32.7±0.80µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, half NULLs                              1.04    132.5±2.05µs        ? ?/sec    1.00    127.8±7.29µs        ? ?/sec
arrow_array_reader/UInt8Array/byte_stream_split encoded, optional, no NULLs                                1.07     40.2±0.23µs        ? ?/sec    1.00     37.5±0.40µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, mandatory, no NULLs                                      1.00     95.2±1.38µs        ? ?/sec    1.09    103.7±0.64µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, half NULLs                                     1.00    166.8±2.11µs        ? ?/sec    1.00    166.5±2.13µs        ? ?/sec
arrow_array_reader/UInt8Array/dictionary encoded, optional, no NULLs                                       1.00     99.8±1.54µs        ? ?/sec    1.08    107.7±1.71µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, mandatory, no NULLs                                           1.10     30.1±0.81µs        ? ?/sec    1.00     27.5±0.22µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, half NULLs                                          1.04    129.3±0.58µs        ? ?/sec    1.00    124.4±2.40µs        ? ?/sec
arrow_array_reader/UInt8Array/plain encoded, optional, no NULLs                                            1.09     34.6±0.28µs        ? ?/sec    1.00     31.7±0.29µs        ? ?/sec

@alamb-ghbot
Copy link
Copy Markdown

🤖 ./gh_compare_arrow.sh gh_compare_arrow.sh Running
Linux aal-dev 6.14.0-1018-gcp #19~24.04.1-Ubuntu SMP Wed Sep 24 23:23:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Comparing pre_allocate_view_vec (a4f04e7) to 843bee2 diff
BENCH_NAME=arrow_reader_row_filter
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental --bench arrow_reader_row_filter
BENCH_FILTER=
BENCH_BRANCH_NAME=pre_allocate_view_vec
Results will be posted here when complete

@alamb-ghbot
Copy link
Copy Markdown

🤖: Benchmark completed

Details

group                                                                                main                                   pre_allocate_view_vec
-----                                                                                ----                                   ---------------------
arrow_reader_row_filter/float64 <= 99.0/all_columns/async                            1.01  1726.4±19.78µs        ? ?/sec    1.00  1716.4±18.20µs        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/all_columns/sync                             1.00  1831.4±17.36µs        ? ?/sec    1.00  1824.9±33.65µs        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/async                  1.00  1577.5±16.35µs        ? ?/sec    1.00  1573.4±45.85µs        ? ?/sec
arrow_reader_row_filter/float64 <= 99.0/exclude_filter_column/sync                   1.01  1556.2±12.69µs        ? ?/sec    1.00  1546.0±29.59µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/async              1.00  1523.2±11.33µs        ? ?/sec    1.01  1537.9±27.63µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/all_columns/sync               1.01  1689.9±25.60µs        ? ?/sec    1.00  1672.6±19.86µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/async    1.01  1354.8±12.67µs        ? ?/sec    1.00  1347.2±25.51µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0 AND ts >= 9000/exclude_filter_column/sync     1.01  1362.5±14.02µs        ? ?/sec    1.00  1354.0±62.31µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/async                             1.00  1722.4±18.68µs        ? ?/sec    1.00  1716.5±15.64µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/all_columns/sync                              1.00  1831.3±15.52µs        ? ?/sec    1.00  1824.5±17.57µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/async                   1.00   1572.1±8.85µs        ? ?/sec    1.00  1573.3±16.10µs        ? ?/sec
arrow_reader_row_filter/float64 > 99.0/exclude_filter_column/sync                    1.00  1550.2±14.56µs        ? ?/sec    1.01  1559.8±17.50µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/async                              1.00   901.0±10.68µs        ? ?/sec    1.01   906.0±23.36µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/all_columns/sync                               1.00    848.7±6.85µs        ? ?/sec    1.01   853.3±14.06µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/async                    1.00   830.5±11.90µs        ? ?/sec    1.00   828.8±12.01µs        ? ?/sec
arrow_reader_row_filter/int64 == 9999/exclude_filter_column/sync                     1.00   840.0±11.66µs        ? ?/sec    1.00    841.5±6.46µs        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/async                                 1.00      3.9±0.05ms        ? ?/sec    1.03      4.0±0.14ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/all_columns/sync                                  1.07      4.0±0.04ms        ? ?/sec    1.00      3.7±0.04ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/async                       1.25      3.8±0.04ms        ? ?/sec    1.00      3.0±0.03ms        ? ?/sec
arrow_reader_row_filter/int64 > 90/exclude_filter_column/sync                        1.28      3.5±0.08ms        ? ?/sec    1.00      2.7±0.02ms        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/async                                  1.02  1961.4±25.62µs        ? ?/sec    1.00  1916.4±13.28µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/all_columns/sync                                   1.05      2.0±0.01ms        ? ?/sec    1.00  1957.9±11.19µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/async                        1.05  1786.2±43.21µs        ? ?/sec    1.00  1700.6±13.08µs        ? ?/sec
arrow_reader_row_filter/ts < 9000/exclude_filter_column/sync                         1.06  1797.7±20.80µs        ? ?/sec    1.00   1702.5±9.55µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/async                                 1.01  1256.6±13.69µs        ? ?/sec    1.00  1243.2±15.49µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/all_columns/sync                                  1.04  1287.4±14.41µs        ? ?/sec    1.00  1243.1±15.56µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/async                       1.03  1143.1±13.50µs        ? ?/sec    1.00  1114.1±21.21µs        ? ?/sec
arrow_reader_row_filter/ts >= 9000/exclude_filter_column/sync                        1.02  1152.9±14.83µs        ? ?/sec    1.00  1129.2±14.51µs        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/async                             1.04      3.3±0.08ms        ? ?/sec    1.00      3.1±0.04ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/all_columns/sync                              1.02      3.5±0.03ms        ? ?/sec    1.00      3.4±0.02ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/async                   1.06      2.8±0.03ms        ? ?/sec    1.00      2.7±0.03ms        ? ?/sec
arrow_reader_row_filter/utf8View <> ''/exclude_filter_column/sync                    1.07      2.6±0.03ms        ? ?/sec    1.00      2.4±0.01ms        ? ?/sec

@alamb-ghbot
Copy link
Copy Markdown

🤖 ./gh_compare_arrow.sh gh_compare_arrow.sh Running
Linux aal-dev 6.14.0-1018-gcp #19~24.04.1-Ubuntu SMP Wed Sep 24 23:23:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Comparing pre_allocate_view_vec (a4f04e7) to 843bee2 diff
BENCH_NAME=arrow_reader_clickbench
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental --bench arrow_reader_clickbench
BENCH_FILTER=
BENCH_BRANCH_NAME=pre_allocate_view_vec
Results will be posted here when complete

@alamb-ghbot
Copy link
Copy Markdown

🤖: Benchmark completed

Details

group                                main                                   pre_allocate_view_vec
-----                                ----                                   ---------------------
arrow_reader_clickbench/async/Q1     1.00      2.3±0.09ms        ? ?/sec    1.00      2.3±0.02ms        ? ?/sec
arrow_reader_clickbench/async/Q10    1.11     13.2±0.30ms        ? ?/sec    1.00     11.9±0.22ms        ? ?/sec
arrow_reader_clickbench/async/Q11    1.08     14.7±0.18ms        ? ?/sec    1.00     13.7±0.23ms        ? ?/sec
arrow_reader_clickbench/async/Q12    1.02     25.8±0.30ms        ? ?/sec    1.00     25.3±0.28ms        ? ?/sec
arrow_reader_clickbench/async/Q13    1.01     31.2±0.60ms        ? ?/sec    1.00     30.9±0.43ms        ? ?/sec
arrow_reader_clickbench/async/Q14    1.02     28.5±0.76ms        ? ?/sec    1.00     28.1±0.26ms        ? ?/sec
arrow_reader_clickbench/async/Q19    1.00      5.3±0.08ms        ? ?/sec    1.02      5.4±0.11ms        ? ?/sec
arrow_reader_clickbench/async/Q20    1.04    114.8±1.83ms        ? ?/sec    1.00    110.7±0.63ms        ? ?/sec
arrow_reader_clickbench/async/Q21    1.04    132.4±0.78ms        ? ?/sec    1.00    127.7±1.36ms        ? ?/sec
arrow_reader_clickbench/async/Q22    1.13    288.5±5.20ms        ? ?/sec    1.00    255.5±6.48ms        ? ?/sec
arrow_reader_clickbench/async/Q23    1.01    407.9±2.34ms        ? ?/sec    1.00    404.5±7.67ms        ? ?/sec
arrow_reader_clickbench/async/Q24    1.00     34.1±0.58ms        ? ?/sec    1.01     34.4±0.39ms        ? ?/sec
arrow_reader_clickbench/async/Q27    1.04    100.7±1.22ms        ? ?/sec    1.00     97.2±0.73ms        ? ?/sec
arrow_reader_clickbench/async/Q28    1.02     99.1±0.52ms        ? ?/sec    1.00     96.8±0.41ms        ? ?/sec
arrow_reader_clickbench/async/Q30    1.01     31.0±0.42ms        ? ?/sec    1.00     30.8±0.33ms        ? ?/sec
arrow_reader_clickbench/async/Q36    1.03    110.3±1.94ms        ? ?/sec    1.00    106.9±0.84ms        ? ?/sec
arrow_reader_clickbench/async/Q37    1.03     85.9±0.87ms        ? ?/sec    1.00     83.8±0.55ms        ? ?/sec
arrow_reader_clickbench/async/Q38    1.01     31.7±0.28ms        ? ?/sec    1.00     31.5±0.30ms        ? ?/sec
arrow_reader_clickbench/async/Q39    1.02     44.9±0.57ms        ? ?/sec    1.00     43.9±0.59ms        ? ?/sec
arrow_reader_clickbench/async/Q40    1.00     25.5±0.30ms        ? ?/sec    1.05     26.9±0.76ms        ? ?/sec
arrow_reader_clickbench/async/Q41    1.00     20.6±0.35ms        ? ?/sec    1.03     21.3±0.53ms        ? ?/sec
arrow_reader_clickbench/async/Q42    1.00      9.9±0.31ms        ? ?/sec    1.02     10.1±0.13ms        ? ?/sec
arrow_reader_clickbench/sync/Q1      1.01      2.1±0.01ms        ? ?/sec    1.00      2.1±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q10     1.08     10.2±0.35ms        ? ?/sec    1.00      9.4±0.15ms        ? ?/sec
arrow_reader_clickbench/sync/Q11     1.09     11.9±0.14ms        ? ?/sec    1.00     11.0±0.18ms        ? ?/sec
arrow_reader_clickbench/sync/Q12     1.00     35.4±1.31ms        ? ?/sec    1.04     36.8±0.66ms        ? ?/sec
arrow_reader_clickbench/sync/Q13     1.04     46.2±1.77ms        ? ?/sec    1.00     44.5±0.54ms        ? ?/sec
arrow_reader_clickbench/sync/Q14     1.00     41.4±0.46ms        ? ?/sec    1.00     41.2±0.66ms        ? ?/sec
arrow_reader_clickbench/sync/Q19     1.00      4.3±0.06ms        ? ?/sec    1.02      4.4±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q20     1.03    177.7±0.95ms        ? ?/sec    1.00    173.1±1.59ms        ? ?/sec
arrow_reader_clickbench/sync/Q21     1.02    235.8±1.70ms        ? ?/sec    1.00    230.6±1.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q22     1.03    478.9±4.51ms        ? ?/sec    1.00    466.6±4.05ms        ? ?/sec
arrow_reader_clickbench/sync/Q23     1.03   428.3±13.69ms        ? ?/sec    1.00   417.3±16.65ms        ? ?/sec
arrow_reader_clickbench/sync/Q24     1.03     44.6±0.36ms        ? ?/sec    1.00     43.2±0.67ms        ? ?/sec
arrow_reader_clickbench/sync/Q27     1.03    153.9±1.11ms        ? ?/sec    1.00    148.7±1.68ms        ? ?/sec
arrow_reader_clickbench/sync/Q28     1.03    148.8±1.02ms        ? ?/sec    1.00    144.7±1.72ms        ? ?/sec
arrow_reader_clickbench/sync/Q30     1.00     30.8±0.30ms        ? ?/sec    1.01     31.0±0.34ms        ? ?/sec
arrow_reader_clickbench/sync/Q36     1.02    141.7±1.00ms        ? ?/sec    1.00    138.7±1.21ms        ? ?/sec
arrow_reader_clickbench/sync/Q37     1.04     78.7±1.29ms        ? ?/sec    1.00     75.8±0.88ms        ? ?/sec
arrow_reader_clickbench/sync/Q38     1.00     24.4±0.43ms        ? ?/sec    1.01     24.6±0.51ms        ? ?/sec
arrow_reader_clickbench/sync/Q39     1.02     31.8±0.64ms        ? ?/sec    1.00     31.2±0.54ms        ? ?/sec
arrow_reader_clickbench/sync/Q40     1.00     23.5±0.36ms        ? ?/sec    1.03     24.4±0.44ms        ? ?/sec
arrow_reader_clickbench/sync/Q41     1.00     19.0±0.65ms        ? ?/sec    1.03     19.5±0.33ms        ? ?/sec
arrow_reader_clickbench/sync/Q42     1.00      9.2±0.24ms        ? ?/sec    1.01      9.3±0.09ms        ? ?/sec

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 12, 2026

run benchmark arrow_reader arrow_reader_row_filter arrow_reader_clickbench

@alamb-ghbot
Copy link
Copy Markdown

🤖 ./gh_compare_arrow.sh gh_compare_arrow.sh Running
Linux aal-dev 6.14.0-1018-gcp #19~24.04.1-Ubuntu SMP Wed Sep 24 23:23:09 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
Comparing pre_allocate_view_vec (a4f04e7) to 843bee2 diff
BENCH_NAME=arrow_reader
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental --bench arrow_reader
BENCH_FILTER=
BENCH_BRANCH_NAME=pre_allocate_view_vec
Results will be posted here when complete

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Jan 12, 2026

Rerunning the benchmarks to see if we can see a consistent pattern

@lyang24
Copy link
Copy Markdown
Contributor Author

lyang24 commented Mar 21, 2026

implemented @Dandandan 's suggestions over the issue and subset of bench on mac

Category Benchmark Branch (µs) Master (µs) Change
StringArray plain, mandatory, no NULLs 631 614 +2.8%
StringArray plain, optional, no NULLs 617 636 -3.0%
StringArray plain, optional, half NULLs 466 485 -3.9%
StringArray dict, mandatory, no NULLs 412 415 -0.7%
StringArray dict, optional, no NULLs 427 410 +4.1%
StringArray dict, optional, half NULLs 381 376 +1.3%
StringArray const prefix delta byte array, mandatory 897 890 +0.8%
StringArray const delta byte array, mandatory 657 655 +0.3%
StringArray const delta length byte array, mandatory 493 472 +4.4%
BinaryArray plain, mandatory, no NULLs 557 584 -4.6%
BinaryArray plain, optional, no NULLs 636 570 +11.6%
BinaryArray plain, optional, half NULLs 423 468 -9.6%
BinaryArray dict, mandatory, no NULLs 413 407 +1.5%
BinaryArray dict, optional, no NULLs 409 408 +0.2%
BinaryArray dict, optional, half NULLs 351 359 -2.2%
BinaryViewArray plain, mandatory, short string 114 119 -4.2%
BinaryViewArray plain, mandatory, no NULLs 123 127 -3.1%
BinaryViewArray plain, optional, no NULLs 126 129 -2.3%
BinaryViewArray plain, optional, half NULLs 119 129 -7.8%
BinaryViewArray dict, mandatory, no NULLs 54 62 -12.9%
BinaryViewArray dict, optional, no NULLs 56 63 -11.1%
BinaryViewArray dict, optional, half NULLs 89 90 -1.1%
StringDictionary dict, mandatory, no NULLs 196 203 -3.4%
StringDictionary dict, optional, no NULLs 199 204 -2.5%
StringDictionary dict, optional, half NULLs 221 230 -3.9%
StringViewArray plain, mandatory, no NULLs 150 155 -3.2%
StringViewArray plain, optional, no NULLs 155 159 -2.5%
StringViewArray plain, optional, half NULLs 131 140 -6.4%
StringViewArray dict, mandatory, no NULLs 54 61 -11.5%
StringViewArray dict, optional, no NULLs 56 62 -9.7%
StringViewArray dict, optional, half NULLs 88 100 -12.0%

@lyang24 lyang24 force-pushed the pre_allocate_view_vec branch from 48ed3bb to d126a19 Compare March 21, 2026 23:08
@lyang24
Copy link
Copy Markdown
Contributor Author

lyang24 commented Mar 22, 2026

the optimization is “reserve the values buffer up front,” but the fixed-length path can’t actually use that reservation at the point where the generic code applies it. so fixed-length arrays gets the overhead of this change but no benefits.

@lyang24
Copy link
Copy Markdown
Contributor Author

lyang24 commented Mar 22, 2026

ran a full scale array reader benchmark on ubuntu i think its a net gain overall, and regression on FixedLenByteArray are confirmed.
bench_comparison.txt

@lyang24 lyang24 requested a review from Dandandan March 22, 2026 07:42
@lyang24 lyang24 marked this pull request as ready for review March 22, 2026 07:43
@alamb

This comment has been minimized.

pub fn new(
row_groups: &'a dyn RowGroups,
metrics: &'a ArrowReaderMetrics,
batch_size: usize,
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.

This is a public API and thus this change is a breaking API change.

Maybe we could avoid changing the API via a new with method instead

something like

let reader = ArrayReaderBuilder::new(row_groups, metrics)
  .with_batch_size(batch_size)

🤔

Copy link
Copy Markdown
Contributor Author

@lyang24 lyang24 Apr 7, 2026

Choose a reason for hiding this comment

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

agreed will change it later this week

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.

this is done ty

@adriangbot

This comment has been minimized.

@adriangbot

This comment has been minimized.

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 1, 2026

run benchmark arrow_reader

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 1, 2026

run benchmark arrow_reader_clickbench

@alamb alamb added the api-change Changes to the arrow API label Apr 1, 2026
@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4170551475-647-8tnr6 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 pre_allocate_view_vec (d126a19) to 6471e9a (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 running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4170552525-648-cx5vx 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 pre_allocate_view_vec (d126a19) to 6471e9a (merge-base) diff
BENCH_NAME=arrow_reader_clickbench
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_clickbench
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                                   pre_allocate_view_vec
-----                                             ----                                   ---------------------
arrow_reader_clickbench/async/Q1                  1.00   1088.3±6.67µs        ? ?/sec    1.00   1089.9±9.97µs        ? ?/sec
arrow_reader_clickbench/async/Q10                 1.02      6.5±0.06ms        ? ?/sec    1.00      6.4±0.06ms        ? ?/sec
arrow_reader_clickbench/async/Q11                 1.03      7.6±0.07ms        ? ?/sec    1.00      7.4±0.07ms        ? ?/sec
arrow_reader_clickbench/async/Q12                 1.04     14.6±0.08ms        ? ?/sec    1.00     14.1±0.05ms        ? ?/sec
arrow_reader_clickbench/async/Q13                 1.05     17.6±0.12ms        ? ?/sec    1.00     16.8±0.11ms        ? ?/sec
arrow_reader_clickbench/async/Q14                 1.04     16.3±0.05ms        ? ?/sec    1.00     15.7±0.05ms        ? ?/sec
arrow_reader_clickbench/async/Q19                 1.04      3.2±0.04ms        ? ?/sec    1.00      3.1±0.03ms        ? ?/sec
arrow_reader_clickbench/async/Q20                 1.32     95.1±1.45ms        ? ?/sec    1.00     72.1±0.22ms        ? ?/sec
arrow_reader_clickbench/async/Q21                 1.30    105.1±8.89ms        ? ?/sec    1.00     80.8±0.29ms        ? ?/sec
arrow_reader_clickbench/async/Q22                 1.08    122.0±3.45ms        ? ?/sec    1.00    113.0±1.07ms        ? ?/sec
arrow_reader_clickbench/async/Q23                 1.00    249.8±1.80ms        ? ?/sec    1.00   250.6±50.09ms        ? ?/sec
arrow_reader_clickbench/async/Q24                 1.04     19.8±0.11ms        ? ?/sec    1.00     19.0±0.10ms        ? ?/sec
arrow_reader_clickbench/async/Q27                 1.03     59.2±0.37ms        ? ?/sec    1.00     57.4±0.30ms        ? ?/sec
arrow_reader_clickbench/async/Q28                 1.02     59.0±0.47ms        ? ?/sec    1.00     57.8±0.25ms        ? ?/sec
arrow_reader_clickbench/async/Q30                 1.00     18.4±0.08ms        ? ?/sec    1.02     18.8±0.09ms        ? ?/sec
arrow_reader_clickbench/async/Q36                 1.00     14.8±0.20ms        ? ?/sec    1.05     15.5±0.26ms        ? ?/sec
arrow_reader_clickbench/async/Q37                 1.00      5.3±0.02ms        ? ?/sec    1.02      5.4±0.03ms        ? ?/sec
arrow_reader_clickbench/async/Q38                 1.00     13.4±0.22ms        ? ?/sec    1.01     13.6±0.27ms        ? ?/sec
arrow_reader_clickbench/async/Q39                 1.03     24.6±0.36ms        ? ?/sec    1.00     23.9±0.30ms        ? ?/sec
arrow_reader_clickbench/async/Q40                 1.00      5.7±0.04ms        ? ?/sec    1.02      5.8±0.06ms        ? ?/sec
arrow_reader_clickbench/async/Q41                 1.00      5.0±0.03ms        ? ?/sec    1.00      5.0±0.03ms        ? ?/sec
arrow_reader_clickbench/async/Q42                 1.00      3.5±0.02ms        ? ?/sec    1.00      3.5±0.02ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q1     1.01   1072.9±7.15µs        ? ?/sec    1.00   1058.4±4.05µs        ? ?/sec
arrow_reader_clickbench/async_object_store/Q10    1.00      6.3±0.06ms        ? ?/sec    1.03      6.5±0.06ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q11    1.00      7.2±0.04ms        ? ?/sec    1.02      7.4±0.05ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q12    1.00     14.1±0.06ms        ? ?/sec    1.01     14.3±0.08ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q13    1.00     16.6±0.09ms        ? ?/sec    1.01     16.8±0.12ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q14    1.00     15.6±0.07ms        ? ?/sec    1.01     15.8±0.07ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q19    1.00      3.0±0.02ms        ? ?/sec    1.01      3.0±0.03ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q20    1.01     71.5±0.61ms        ? ?/sec    1.00     71.2±0.42ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q21    1.00     80.4±0.54ms        ? ?/sec    1.00     80.3±0.47ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q22    1.02     99.3±1.19ms        ? ?/sec    1.00     97.7±0.42ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q23    1.05    234.0±8.34ms        ? ?/sec    1.00    221.9±0.90ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q24    1.00     19.0±0.11ms        ? ?/sec    1.00     19.1±0.09ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q27    1.01     57.3±0.58ms        ? ?/sec    1.00     56.7±0.47ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q28    1.01     57.4±0.57ms        ? ?/sec    1.00     56.7±0.28ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q30    1.00     18.1±0.10ms        ? ?/sec    1.01     18.2±0.10ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q36    1.02     14.8±0.20ms        ? ?/sec    1.00     14.4±0.25ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q37    1.00      5.3±0.03ms        ? ?/sec    1.00      5.3±0.01ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q38    1.03     13.0±0.22ms        ? ?/sec    1.00     12.7±0.13ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q39    1.05     23.9±0.42ms        ? ?/sec    1.00     22.7±0.27ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q40    1.02      5.6±0.04ms        ? ?/sec    1.00      5.5±0.03ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q41    1.02      4.9±0.03ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q42    1.02      3.4±0.01ms        ? ?/sec    1.00      3.4±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q1                   1.00    871.1±3.32µs        ? ?/sec    1.00    874.1±1.59µs        ? ?/sec
arrow_reader_clickbench/sync/Q10                  1.00      5.1±0.02ms        ? ?/sec    1.00      5.0±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q11                  1.01      6.0±0.09ms        ? ?/sec    1.00      5.9±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q12                  1.01     21.4±0.06ms        ? ?/sec    1.00     21.3±0.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q13                  1.28     30.7±0.49ms        ? ?/sec    1.00     24.0±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q14                  1.00     22.8±0.09ms        ? ?/sec    1.00     22.7±0.07ms        ? ?/sec
arrow_reader_clickbench/sync/Q19                  1.00      2.7±0.04ms        ? ?/sec    1.00      2.7±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q20                  1.04    125.6±1.81ms        ? ?/sec    1.00    121.1±0.77ms        ? ?/sec
arrow_reader_clickbench/sync/Q21                  1.01     93.5±0.23ms        ? ?/sec    1.00     92.7±0.21ms        ? ?/sec
arrow_reader_clickbench/sync/Q22                  1.00    140.3±1.62ms        ? ?/sec    1.01    142.0±1.03ms        ? ?/sec
arrow_reader_clickbench/sync/Q23                  1.01   286.1±17.42ms        ? ?/sec    1.00   283.8±10.18ms        ? ?/sec
arrow_reader_clickbench/sync/Q24                  1.02     26.9±0.11ms        ? ?/sec    1.00     26.4±0.10ms        ? ?/sec
arrow_reader_clickbench/sync/Q27                  1.01    107.9±0.46ms        ? ?/sec    1.00    107.4±0.41ms        ? ?/sec
arrow_reader_clickbench/sync/Q28                  1.03    107.0±0.96ms        ? ?/sec    1.00    103.5±0.26ms        ? ?/sec
arrow_reader_clickbench/sync/Q30                  1.02     18.8±0.27ms        ? ?/sec    1.00     18.4±0.07ms        ? ?/sec
arrow_reader_clickbench/sync/Q36                  1.01     22.1±0.20ms        ? ?/sec    1.00     21.8±0.07ms        ? ?/sec
arrow_reader_clickbench/sync/Q37                  1.02      6.8±0.05ms        ? ?/sec    1.00      6.7±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q38                  1.02     11.4±0.07ms        ? ?/sec    1.00     11.2±0.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q39                  1.05     21.0±0.11ms        ? ?/sec    1.00     20.1±0.10ms        ? ?/sec
arrow_reader_clickbench/sync/Q40                  1.03      5.3±0.03ms        ? ?/sec    1.00      5.1±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q41                  1.04      5.7±0.02ms        ? ?/sec    1.00      5.5±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q42                  1.02      4.4±0.03ms        ? ?/sec    1.00      4.3±0.03ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 786.4s
Peak memory 3.1 GiB
Avg memory 3.0 GiB
CPU user 705.6s
CPU sys 80.6s
Disk read 0 B
Disk write 854.0 MiB

branch

Metric Value
Wall time 774.1s
Peak memory 3.2 GiB
Avg memory 3.1 GiB
CPU user 709.1s
CPU sys 65.1s
Disk read 0 B
Disk write 171.3 MiB

File an issue against this benchmark runner

@Dandandan
Copy link
Copy Markdown
Contributor

run benchmark arrow_reader_clickbench

@adriangbot
Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4176256778-656-fggb9 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 pre_allocate_view_vec (d126a19) to 6471e9a (merge-base) diff
BENCH_NAME=arrow_reader_clickbench
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_reader_clickbench
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                                   pre_allocate_view_vec
-----                                             ----                                   ---------------------
arrow_reader_clickbench/async/Q1                  1.01   1088.3±4.77µs        ? ?/sec    1.00   1078.6±5.30µs        ? ?/sec
arrow_reader_clickbench/async/Q10                 1.02      6.5±0.05ms        ? ?/sec    1.00      6.4±0.04ms        ? ?/sec
arrow_reader_clickbench/async/Q11                 1.01      7.6±0.08ms        ? ?/sec    1.00      7.5±0.05ms        ? ?/sec
arrow_reader_clickbench/async/Q12                 1.02     14.6±0.08ms        ? ?/sec    1.00     14.3±0.04ms        ? ?/sec
arrow_reader_clickbench/async/Q13                 1.02     17.2±0.07ms        ? ?/sec    1.00     16.9±0.06ms        ? ?/sec
arrow_reader_clickbench/async/Q14                 1.00     16.0±0.07ms        ? ?/sec    1.00     15.9±0.08ms        ? ?/sec
arrow_reader_clickbench/async/Q19                 1.02      3.1±0.03ms        ? ?/sec    1.00      3.0±0.02ms        ? ?/sec
arrow_reader_clickbench/async/Q20                 1.13     92.5±4.42ms        ? ?/sec    1.00     82.0±0.24ms        ? ?/sec
arrow_reader_clickbench/async/Q21                 1.09    108.7±3.09ms        ? ?/sec    1.00     99.8±5.89ms        ? ?/sec
arrow_reader_clickbench/async/Q22                 1.00   131.5±11.24ms        ? ?/sec    1.00    131.7±7.33ms        ? ?/sec
arrow_reader_clickbench/async/Q23                 1.03    245.2±1.59ms        ? ?/sec    1.00    238.6±1.14ms        ? ?/sec
arrow_reader_clickbench/async/Q24                 1.03     19.7±0.16ms        ? ?/sec    1.00     19.1±0.06ms        ? ?/sec
arrow_reader_clickbench/async/Q27                 1.03     57.9±0.35ms        ? ?/sec    1.00     56.4±0.10ms        ? ?/sec
arrow_reader_clickbench/async/Q28                 1.03     58.2±0.32ms        ? ?/sec    1.00     56.7±0.12ms        ? ?/sec
arrow_reader_clickbench/async/Q30                 1.00     18.4±0.07ms        ? ?/sec    1.00     18.4±0.06ms        ? ?/sec
arrow_reader_clickbench/async/Q36                 1.04     15.7±0.38ms        ? ?/sec    1.00     15.1±0.10ms        ? ?/sec
arrow_reader_clickbench/async/Q37                 1.00      5.4±0.02ms        ? ?/sec    1.00      5.4±0.03ms        ? ?/sec
arrow_reader_clickbench/async/Q38                 1.06     14.0±0.30ms        ? ?/sec    1.00     13.1±0.11ms        ? ?/sec
arrow_reader_clickbench/async/Q39                 1.07     25.3±0.64ms        ? ?/sec    1.00     23.6±0.22ms        ? ?/sec
arrow_reader_clickbench/async/Q40                 1.01      5.7±0.04ms        ? ?/sec    1.00      5.7±0.04ms        ? ?/sec
arrow_reader_clickbench/async/Q41                 1.01      5.0±0.03ms        ? ?/sec    1.00      5.0±0.03ms        ? ?/sec
arrow_reader_clickbench/async/Q42                 1.02      3.6±0.02ms        ? ?/sec    1.00      3.5±0.01ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q1     1.00   1056.4±5.86µs        ? ?/sec    1.00  1051.3±13.46µs        ? ?/sec
arrow_reader_clickbench/async_object_store/Q10    1.01      6.4±0.06ms        ? ?/sec    1.00      6.4±0.03ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q11    1.03      7.5±0.09ms        ? ?/sec    1.00      7.3±0.04ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q12    1.01     14.4±0.09ms        ? ?/sec    1.00     14.2±0.05ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q13    1.02     17.1±0.12ms        ? ?/sec    1.00     16.8±0.14ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q14    1.01     15.9±0.11ms        ? ?/sec    1.00     15.8±0.05ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q19    1.02      3.0±0.02ms        ? ?/sec    1.00      2.9±0.02ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q20    1.02     72.0±0.51ms        ? ?/sec    1.00     70.6±0.14ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q21    1.03     81.2±0.54ms        ? ?/sec    1.00     79.0±0.14ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q22    1.02     98.1±0.54ms        ? ?/sec    1.00     95.9±0.20ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q23    1.05    226.3±5.82ms        ? ?/sec    1.00    216.1±2.54ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q24    1.00     19.2±0.11ms        ? ?/sec    1.00     19.1±0.12ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q27    1.02     57.2±0.41ms        ? ?/sec    1.00     55.8±0.14ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q28    1.02     57.4±0.45ms        ? ?/sec    1.00     56.1±0.16ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q30    1.01     18.3±0.10ms        ? ?/sec    1.00     18.1±0.04ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q36    1.03     15.0±0.30ms        ? ?/sec    1.00     14.5±0.10ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q37    1.01      5.3±0.03ms        ? ?/sec    1.00      5.2±0.01ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q38    1.03     13.1±0.20ms        ? ?/sec    1.00     12.7±0.09ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q39    1.06     24.0±0.45ms        ? ?/sec    1.00     22.7±0.13ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q40    1.01      5.5±0.05ms        ? ?/sec    1.00      5.5±0.02ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q41    1.01      4.8±0.04ms        ? ?/sec    1.00      4.8±0.02ms        ? ?/sec
arrow_reader_clickbench/async_object_store/Q42    1.01      3.4±0.02ms        ? ?/sec    1.00      3.4±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q1                   1.00   878.1±11.20µs        ? ?/sec    1.00    881.2±2.35µs        ? ?/sec
arrow_reader_clickbench/sync/Q10                  1.01      5.1±0.04ms        ? ?/sec    1.00      5.0±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q11                  1.01      6.0±0.09ms        ? ?/sec    1.00      6.0±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q12                  1.01     21.7±0.05ms        ? ?/sec    1.00     21.5±0.05ms        ? ?/sec
arrow_reader_clickbench/sync/Q13                  1.27     30.8±0.18ms        ? ?/sec    1.00     24.2±0.06ms        ? ?/sec
arrow_reader_clickbench/sync/Q14                  1.01     23.1±0.08ms        ? ?/sec    1.00     22.9±0.08ms        ? ?/sec
arrow_reader_clickbench/sync/Q19                  1.01      2.7±0.02ms        ? ?/sec    1.00      2.7±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q20                  1.03    123.8±0.21ms        ? ?/sec    1.00    120.4±0.31ms        ? ?/sec
arrow_reader_clickbench/sync/Q21                  1.00     95.7±1.91ms        ? ?/sec    1.00     95.5±0.17ms        ? ?/sec
arrow_reader_clickbench/sync/Q22                  1.00    136.6±2.01ms        ? ?/sec    1.04    141.7±0.22ms        ? ?/sec
arrow_reader_clickbench/sync/Q23                  1.00   280.1±15.64ms        ? ?/sec    1.02   285.1±10.14ms        ? ?/sec
arrow_reader_clickbench/sync/Q24                  1.03     27.2±0.06ms        ? ?/sec    1.00     26.5±0.05ms        ? ?/sec
arrow_reader_clickbench/sync/Q27                  1.05    109.8±8.54ms        ? ?/sec    1.00    104.8±0.12ms        ? ?/sec
arrow_reader_clickbench/sync/Q28                  1.03    105.9±0.22ms        ? ?/sec    1.00    102.6±0.10ms        ? ?/sec
arrow_reader_clickbench/sync/Q30                  1.02     18.8±0.05ms        ? ?/sec    1.00     18.4±0.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q36                  1.03     22.4±0.06ms        ? ?/sec    1.00     21.8±0.07ms        ? ?/sec
arrow_reader_clickbench/sync/Q37                  1.02      6.8±0.01ms        ? ?/sec    1.00      6.7±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q38                  1.02     11.6±0.03ms        ? ?/sec    1.00     11.4±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q39                  1.06     21.5±0.11ms        ? ?/sec    1.00     20.3±0.04ms        ? ?/sec
arrow_reader_clickbench/sync/Q40                  1.04      5.3±0.04ms        ? ?/sec    1.00      5.1±0.02ms        ? ?/sec
arrow_reader_clickbench/sync/Q41                  1.05      5.7±0.03ms        ? ?/sec    1.00      5.5±0.01ms        ? ?/sec
arrow_reader_clickbench/sync/Q42                  1.05      4.5±0.03ms        ? ?/sec    1.00      4.2±0.01ms        ? ?/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 788.9s
Peak memory 3.1 GiB
Avg memory 2.9 GiB
CPU user 707.9s
CPU sys 80.9s
Disk read 0 B
Disk write 1.9 GiB

branch

Metric Value
Wall time 780.3s
Peak memory 3.2 GiB
Avg memory 3.1 GiB
CPU user 711.7s
CPU sys 68.6s
Disk read 0 B
Disk write 171.3 MiB

File an issue against this benchmark runner

@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 6, 2026

i have been working on this PR in the background. I am trying to ensure it doesn't over-allocate on all paths and I am currently arguing with codex about a few cases. The performance looks promising I think

- Optimize OffsetBuffer dict decode by inlining extend + offset push
- Use raw ptr writes in ByteViewArray dictionary decoder for better perf
- Remove unused append_raw_view_unchecked from ViewBuffer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@lyang24 lyang24 force-pushed the pre_allocate_view_vec branch from d126a19 to 3d7ba2d Compare April 12, 2026 05:46
@lyang24 lyang24 requested a review from alamb April 12, 2026 05:47
Comment on lines 221 to +228
fn read_one_batch(&mut self, batch_size: usize) -> Result<usize> {
// Update capacity hint to the largest batch size seen
if batch_size > self.capacity_hint {
self.capacity_hint = batch_size;
}

// Lazily initialize buffer on first read
let capacity_hint = self.capacity_hint;
Copy link
Copy Markdown
Contributor

@alamb alamb Apr 16, 2026

Choose a reason for hiding this comment

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

It would be nice to avoid the allocation on a zero sized read (end of stream)

Suggested change
fn read_one_batch(&mut self, batch_size: usize) -> Result<usize> {
// Update capacity hint to the largest batch size seen
if batch_size > self.capacity_hint {
self.capacity_hint = batch_size;
}
// Lazily initialize buffer on first read
let capacity_hint = self.capacity_hint;
fn read_one_batch(&mut self, batch_size: usize) -> Result<usize> {
if batch_size == 0 {
return Ok(0);
}
// Update capacity hint to the largest batch size seen
if batch_size > self.capacity_hint {
self.capacity_hint = batch_size;
}

Comment on lines +296 to 303
// The decoder will pre-allocate when it knows both capacity and byte_length
Self {
buffer: Vec::new(),
byte_length: None,
}
}

fn pad_nulls(
Copy link
Copy Markdown
Contributor

@alamb alamb Apr 16, 2026

Choose a reason for hiding this comment

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

You could potentially improve the allocation in the fixed size buffer too by deferring the allocation until we know the value_capaoity

    fn with_capacity(capacity: usize) -> Self {
        // `byte_length` is not known initially, so preserve the value-count
        // hint so the first decode can allocate the exact byte capacity.
        Self {
            buffer: Vec::new(),
            byte_length: None,
            values_capacity: Some(capacity),
        }
    }

Copy link
Copy Markdown
Contributor

@alamb alamb Apr 16, 2026

Choose a reason for hiding this comment

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

And the matching use-site change would be:

            None => {
                out.byte_length = Some(self.byte_length);
                if out.buffer.is_empty()
                    && let Some(values_capacity) = out.values_capacity.take()
                {
                    // now that the byte length per output element is is known,
                    // allocate the actual needed space.
                    let byte_capacity = values_capacity.saturating_mul(self.byte_length);
                    out.buffer = Vec::with_capacity(byte_capacity);
                }
            }

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.

We can do this as a follow on PR

@alamb alamb removed the api-change Changes to the arrow API label Apr 16, 2026
@alamb
Copy link
Copy Markdown
Contributor

alamb commented Apr 16, 2026

The only API changes here are to the experimental feature (array-reader) but I think that is ok to merge

Copy link
Copy Markdown
Contributor

@alamb alamb left a comment

Choose a reason for hiding this comment

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

TLDR is I think this is really nice -- thank you @lyang24

I went through it carefully and I think it really does a good job

I had two small suggestions, which I think we could also do as a follow on PR.

Please let me know your preference

Thank you for your patience. This is great

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] Reduce reallocations when reading StringView in parquet

5 participants