Skip to content

optimize(parquet): Nested list batching child.write calls - #10085

Merged
alamb merged 11 commits into
apache:mainfrom
mapleFU:nested-list-optimize-write
Jul 20, 2026
Merged

optimize(parquet): Nested list batching child.write calls#10085
alamb merged 11 commits into
apache:mainfrom
mapleFU:nested-list-optimize-write

Conversation

@mapleFU

@mapleFU mapleFU commented Jun 6, 2026

Copy link
Copy Markdown
Member

Which issue does this PR close?

Rationale for this change

Optimize nested list call recursive write counts.

What changes are included in this PR?

Separate list write function to direct-by-offsets and by backward scan

Are these changes tested?

Covered by existing

Are there any user-facing changes?

No

@github-actions github-actions Bot added the parquet Changes to the parquet crate label Jun 6, 2026
/// counting child-element starts to find and stamp slot boundaries.
///
/// Scan backward because we don't know start offset before writing.
fn write_list_scan<O: OffsetSizeTrait>(

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I previously want to remove the branch for write non-nested childs, however benchmark shows that adding a more branch will hurt the performance. So I split it to two functions.

for rep in rep_levels.iter_mut().rev() {
// This can uses `==`, since list write is recursive and the child is written
// before the parent.
if *rep <= ctx.rep_level {

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I still use <= because benchmark shows no performance enhancement between <= and ==, so just uses <=

// before the parent.
if *rep <= ctx.rep_level {
seen += 1;
if seen == next_stamp_at {

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Maybe we can SIMD this in the future, this is not cirtical in this branch. Or we can "batching" if list offsets is large. E.g. checking not one-by-one, and just batch by batch

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR optimizes Parquet level generation for nested Arrow List types by batching child.write(...) calls and applying repetition-level backfilling in larger chunks, reducing recursive write-call overhead for deeply nested list structures.

Changes:

  • Split list writing into two specialized hot paths: an offsets-based “direct” backfill for last-level list children and a backward-scan backfill for nested repetition cases
  • Extracted a shared run-classification loop (write_list_impl) to batch null/empty/non-empty runs while keeping monomorphized backfill strategies

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread parquet/src/arrow/arrow_writer/levels.rs Outdated
Comment thread parquet/src/arrow/arrow_writer/levels.rs Outdated
Comment thread parquet/src/arrow/arrow_writer/levels.rs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Comment thread parquet/src/arrow/arrow_writer/levels.rs Outdated
@mapleFU
mapleFU requested a review from alamb June 11, 2026 02:00
@alamb

alamb commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_writer

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4682497841-533-jtp2z 6.12.68+ #1 SMP Sat May 2 07:49:07 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 nested-list-optimize-write (0d16db7) to c3e0684 (merge-base) diff
BENCH_NAME=arrow_writer
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_writer
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                                   nested-list-optimize-write
-----                                              ----                                   --------------------------
bool/bloom_filter                                  1.00     12.9±0.04ms    19.4 MB/sec    1.02     13.2±0.09ms    19.0 MB/sec
bool/cdc                                           1.00     15.7±0.06ms    15.9 MB/sec    1.01     15.9±0.09ms    15.7 MB/sec
bool/default                                       1.00     10.7±0.04ms    23.3 MB/sec    1.04     11.2±0.09ms    22.4 MB/sec
bool/parquet_2                                     1.00     14.6±0.05ms    17.2 MB/sec    1.02     14.9±0.07ms    16.8 MB/sec
bool/zstd                                          1.00     11.3±0.05ms    22.1 MB/sec    1.02     11.6±0.07ms    21.6 MB/sec
bool/zstd_parquet_2                                1.00     14.9±0.06ms    16.7 MB/sec    1.02     15.2±0.10ms    16.5 MB/sec
bool_non_null/bloom_filter                         1.00      7.0±0.02ms    17.9 MB/sec    1.01      7.0±0.02ms    17.8 MB/sec
bool_non_null/cdc                                  1.00      6.8±0.03ms    18.3 MB/sec    1.01      6.9±0.06ms    18.1 MB/sec
bool_non_null/default                              1.00      4.3±0.02ms    29.4 MB/sec    1.01      4.3±0.02ms    29.1 MB/sec
bool_non_null/parquet_2                            1.00      9.0±0.04ms    13.9 MB/sec    1.01      9.1±0.03ms    13.8 MB/sec
bool_non_null/zstd                                 1.00      4.6±0.03ms    27.1 MB/sec    1.01      4.7±0.02ms    26.9 MB/sec
bool_non_null/zstd_parquet_2                       1.00      9.4±0.04ms    13.3 MB/sec    1.01      9.5±0.03ms    13.2 MB/sec
float_with_nans/bloom_filter                       1.00     92.8±0.38ms   150.9 MB/sec    1.00     92.6±0.27ms   151.2 MB/sec
float_with_nans/cdc                                1.00     81.7±0.21ms   171.4 MB/sec    1.00     81.8±0.15ms   171.1 MB/sec
float_with_nans/default                            1.00     74.6±0.20ms   187.7 MB/sec    1.00     74.8±0.17ms   187.2 MB/sec
float_with_nans/parquet_2                          1.00     94.6±0.36ms   148.0 MB/sec    1.01     95.1±0.33ms   147.2 MB/sec
float_with_nans/zstd                               1.00    112.4±0.20ms   124.5 MB/sec    1.00    112.5±0.20ms   124.4 MB/sec
float_with_nans/zstd_parquet_2                     1.00    131.9±0.31ms   106.1 MB/sec    1.00    132.2±0.26ms   105.9 MB/sec
large_string_non_null/bloom_filter                 1.00     71.8±0.15ms     3.5 GB/sec    1.02     73.2±0.21ms     3.4 GB/sec
large_string_non_null/cdc                          1.00    243.6±1.07ms  1050.7 MB/sec    1.00    244.6±1.38ms  1046.7 MB/sec
large_string_non_null/default                      1.00     54.3±0.15ms     4.6 GB/sec    1.02     55.3±0.15ms     4.5 GB/sec
large_string_non_null/parquet_2                    1.00     54.3±0.15ms     4.6 GB/sec    1.02     55.3±0.21ms     4.5 GB/sec
large_string_non_null/zstd                         1.00     54.3±0.12ms     4.6 GB/sec    1.01     55.1±0.23ms     4.5 GB/sec
large_string_non_null/zstd_parquet_2               1.00     54.4±0.12ms     4.6 GB/sec    1.01     55.2±0.21ms     4.5 GB/sec
list_nested/bloom_filter                           1.08    158.9±0.30ms   181.6 MB/sec    1.00    146.6±0.20ms   196.8 MB/sec
list_nested/cdc                                    1.06    175.0±0.24ms   164.9 MB/sec    1.00    164.7±0.14ms   175.2 MB/sec
list_nested/default                                1.07    143.9±0.21ms   200.5 MB/sec    1.00    134.0±0.22ms   215.3 MB/sec
list_nested/parquet_2                              1.07    157.3±0.28ms   183.5 MB/sec    1.00    147.4±0.47ms   195.8 MB/sec
list_nested/zstd                                   1.07    153.1±0.33ms   188.5 MB/sec    1.00    142.6±0.14ms   202.4 MB/sec
list_nested/zstd_parquet_2                         1.06    170.2±0.22ms   169.6 MB/sec    1.00    159.9±0.20ms   180.5 MB/sec
list_primitive/bloom_filter                        1.00    287.6±1.67ms  1896.6 MB/sec    1.04    300.5±1.86ms  1815.0 MB/sec
list_primitive/cdc                                 1.01    323.0±2.01ms  1688.6 MB/sec    1.00    320.4±0.41ms  1702.2 MB/sec
list_primitive/default                             1.00    212.1±1.78ms     2.5 GB/sec    1.03    219.3±3.53ms     2.4 GB/sec
list_primitive/parquet_2                           1.00    232.7±0.37ms     2.3 GB/sec    1.01    235.2±0.52ms     2.3 GB/sec
list_primitive/zstd                                1.00    460.4±3.09ms  1184.6 MB/sec    1.00    460.2±0.45ms  1185.0 MB/sec
list_primitive/zstd_parquet_2                      1.00    457.2±5.60ms  1192.7 MB/sec    1.00    458.9±0.41ms  1188.5 MB/sec
list_primitive_non_null/bloom_filter               1.00    399.7±3.75ms  1361.6 MB/sec    1.03    410.2±6.92ms  1326.7 MB/sec
list_primitive_non_null/cdc                        1.01   414.4±10.18ms  1313.3 MB/sec    1.00    411.4±8.30ms  1323.0 MB/sec
list_primitive_non_null/default                    1.00    266.8±4.78ms  2040.1 MB/sec    1.03    274.5±8.13ms  1983.0 MB/sec
list_primitive_non_null/parquet_2                  1.00   284.4±13.10ms  1913.5 MB/sec    1.00    283.7±1.31ms  1918.5 MB/sec
list_primitive_non_null/zstd                       1.00    693.3±4.57ms   785.0 MB/sec    1.00   691.6±12.90ms   786.9 MB/sec
list_primitive_non_null/zstd_parquet_2             1.00    661.2±5.57ms   823.1 MB/sec    1.02    676.6±4.85ms   804.4 MB/sec
list_primitive_sparse_99pct_null/bloom_filter      1.00     12.7±0.11ms     2.9 GB/sec    1.01     12.9±0.06ms     2.8 GB/sec
list_primitive_sparse_99pct_null/cdc               1.00     24.2±0.08ms  1546.2 MB/sec    1.01     24.4±0.11ms  1531.3 MB/sec
list_primitive_sparse_99pct_null/default           1.00     12.4±0.06ms     3.0 GB/sec    1.00     12.4±0.08ms     2.9 GB/sec
list_primitive_sparse_99pct_null/parquet_2         1.00     12.3±0.07ms     3.0 GB/sec    1.01     12.5±0.06ms     2.9 GB/sec
list_primitive_sparse_99pct_null/zstd              1.00     14.2±0.08ms     2.6 GB/sec    1.01     14.3±0.06ms     2.6 GB/sec
list_primitive_sparse_99pct_null/zstd_parquet_2    1.00     12.4±0.08ms     2.9 GB/sec    1.01     12.5±0.07ms     2.9 GB/sec
list_struct_with_list/bloom_filter                 1.11    316.0±0.89ms   144.3 MB/sec    1.00    283.8±0.43ms   160.7 MB/sec
list_struct_with_list/cdc                          1.08    349.1±0.57ms   130.6 MB/sec    1.00    324.1±0.44ms   140.7 MB/sec
list_struct_with_list/default                      1.10    284.7±0.76ms   160.1 MB/sec    1.00    258.8±0.44ms   176.2 MB/sec
list_struct_with_list/parquet_2                    1.10    302.7±0.65ms   150.6 MB/sec    1.00    276.4±0.47ms   165.0 MB/sec
list_struct_with_list/zstd                         1.09    306.5±0.76ms   148.8 MB/sec    1.00    280.4±0.51ms   162.6 MB/sec
list_struct_with_list/zstd_parquet_2               1.09    325.8±0.59ms   140.0 MB/sec    1.00    300.1±0.51ms   151.9 MB/sec
primitive/bloom_filter                             1.00    148.2±2.01ms   302.7 MB/sec    1.01    149.8±0.52ms   299.6 MB/sec
primitive/cdc                                      1.00    157.8±0.45ms   284.4 MB/sec    1.02    160.5±0.54ms   279.6 MB/sec
primitive/default                                  1.00    117.1±0.65ms   383.2 MB/sec    1.02    119.7±0.50ms   375.0 MB/sec
primitive/parquet_2                                1.00    132.8±0.80ms   337.9 MB/sec    1.01    134.4±0.50ms   333.8 MB/sec
primitive/zstd                                     1.00    146.8±0.42ms   305.7 MB/sec    1.02    149.2±0.43ms   300.7 MB/sec
primitive/zstd_parquet_2                           1.00    166.2±0.68ms   270.0 MB/sec    1.01    168.2±0.82ms   266.8 MB/sec
primitive_all_null/bloom_filter                    1.00    924.8±3.99µs    47.4 GB/sec    1.02    939.9±3.51µs    46.6 GB/sec
primitive_all_null/cdc                             1.00     19.1±0.30ms     2.3 GB/sec    1.02     19.5±0.58ms     2.2 GB/sec
primitive_all_null/default                         1.00    313.0±1.25µs   140.0 GB/sec    1.02    320.8±1.35µs   136.6 GB/sec
primitive_all_null/parquet_2                       1.00    317.9±1.35µs   137.9 GB/sec    1.00    319.3±1.30µs   137.2 GB/sec
primitive_all_null/zstd                            1.00    429.5±1.27µs   102.0 GB/sec    1.02    437.2±1.54µs   100.2 GB/sec
primitive_all_null/zstd_parquet_2                  1.00    398.7±1.35µs   109.9 GB/sec    1.01    403.8±1.89µs   108.5 GB/sec
primitive_non_null/bloom_filter                    1.01    106.4±0.39ms   413.7 MB/sec    1.00    105.1±0.25ms   418.8 MB/sec
primitive_non_null/cdc                             1.00     90.7±0.25ms   485.2 MB/sec    1.00     90.3±0.33ms   487.1 MB/sec
primitive_non_null/default                         1.00     67.7±0.23ms   650.3 MB/sec    1.00     67.6±0.27ms   650.9 MB/sec
primitive_non_null/parquet_2                       1.00     89.8±0.23ms   490.2 MB/sec    1.00     89.5±0.26ms   491.9 MB/sec
primitive_non_null/zstd                            1.00     98.6±0.17ms   446.0 MB/sec    1.00     98.4±0.18ms   447.3 MB/sec
primitive_non_null/zstd_parquet_2                  1.00    123.5±0.20ms   356.3 MB/sec    1.00    123.2±0.19ms   357.1 MB/sec
primitive_sparse_99pct_null/bloom_filter           1.00     12.5±0.13ms     3.5 GB/sec    1.02     12.8±0.16ms     3.4 GB/sec
primitive_sparse_99pct_null/cdc                    1.00     30.3±0.26ms  1481.2 MB/sec    1.00     30.3±0.31ms  1479.6 MB/sec
primitive_sparse_99pct_null/default                1.00     10.8±0.07ms     4.0 GB/sec    1.01     10.9±0.08ms     4.0 GB/sec
primitive_sparse_99pct_null/parquet_2              1.00     10.8±0.07ms     4.0 GB/sec    1.01     10.9±0.08ms     4.0 GB/sec
primitive_sparse_99pct_null/zstd                   1.00     14.2±0.08ms     3.1 GB/sec    1.02     14.4±0.10ms     3.0 GB/sec
primitive_sparse_99pct_null/zstd_parquet_2         1.00     12.8±0.08ms     3.4 GB/sec    1.02     13.0±0.07ms     3.4 GB/sec
short_string_non_null/bloom_filter                 1.03     27.7±0.07ms   433.1 MB/sec    1.00     26.9±0.09ms   446.2 MB/sec
short_string_non_null/cdc                          1.00     20.0±0.06ms   598.7 MB/sec    1.01     20.2±0.05ms   593.3 MB/sec
short_string_non_null/default                      1.00     15.9±0.05ms   755.3 MB/sec    1.01     16.0±0.09ms   748.3 MB/sec
short_string_non_null/parquet_2                    1.00     25.6±0.06ms   467.9 MB/sec    1.01     25.9±0.05ms   463.6 MB/sec
short_string_non_null/zstd                         1.00     35.4±0.09ms   338.6 MB/sec    1.01     35.6±0.10ms   336.9 MB/sec
short_string_non_null/zstd_parquet_2               1.00     28.5±0.06ms   420.8 MB/sec    1.01     28.7±0.05ms   418.3 MB/sec
string/bloom_filter                                1.00   217.7±14.09ms     2.4 GB/sec    1.09   236.2±25.14ms     2.2 GB/sec
string/cdc                                         1.00    219.0±6.49ms     2.3 GB/sec    1.01   221.8±15.61ms     2.3 GB/sec
string/default                                     1.07   140.3±20.36ms     3.6 GB/sec    1.00   130.9±18.99ms     3.9 GB/sec
string/parquet_2                                   1.00   161.0±23.66ms     3.2 GB/sec    1.23    197.3±2.34ms     2.6 GB/sec
string/zstd                                        1.00   440.6±17.07ms  1190.0 MB/sec    1.01   446.6±20.24ms  1173.9 MB/sec
string/zstd_parquet_2                              1.00    407.9±9.59ms  1285.1 MB/sec    1.01   413.2±13.23ms  1268.9 MB/sec
string_and_binary_view/bloom_filter                1.01     64.5±0.20ms   499.8 MB/sec    1.00     64.0±0.37ms   503.7 MB/sec
string_and_binary_view/cdc                         1.00     59.3±0.30ms   544.1 MB/sec    1.01     59.7±0.25ms   540.6 MB/sec
string_and_binary_view/default                     1.00     48.4±0.31ms   667.0 MB/sec    1.02     49.2±0.19ms   655.0 MB/sec
string_and_binary_view/parquet_2                   1.00     59.4±0.17ms   542.6 MB/sec    1.01     60.2±0.29ms   535.5 MB/sec
string_and_binary_view/zstd                        1.00     84.9±0.16ms   379.7 MB/sec    1.01     85.9±0.26ms   375.5 MB/sec
string_and_binary_view/zstd_parquet_2              1.00     73.3±0.19ms   439.7 MB/sec    1.01     74.1±0.22ms   435.4 MB/sec
string_dictionary/bloom_filter                     1.00     88.5±0.73ms     2.9 GB/sec    1.03     91.2±1.45ms     2.8 GB/sec
string_dictionary/cdc                              1.00     50.7±0.28ms     5.1 GB/sec    1.03     52.0±0.48ms     5.0 GB/sec
string_dictionary/default                          1.00     46.8±0.83ms     5.5 GB/sec    1.03     48.4±1.20ms     5.3 GB/sec
string_dictionary/parquet_2                        1.00     54.3±0.22ms     4.8 GB/sec    1.01     55.1±0.31ms     4.7 GB/sec
string_dictionary/zstd                             1.00    207.8±1.49ms  1271.1 MB/sec    1.01    209.0±1.56ms  1263.7 MB/sec
string_dictionary/zstd_parquet_2                   1.00    198.6±0.20ms  1330.0 MB/sec    1.00    199.5±0.22ms  1323.9 MB/sec
string_non_null/bloom_filter                       1.00   245.5±16.29ms     2.1 GB/sec    1.03   253.3±11.27ms     2.0 GB/sec
string_non_null/cdc                                1.00    262.4±8.78ms  1996.6 MB/sec    1.04    272.4±6.31ms  1924.0 MB/sec
string_non_null/default                            1.00   135.4±13.98ms     3.8 GB/sec    1.04   140.7±12.80ms     3.6 GB/sec
string_non_null/parquet_2                          1.03   141.8±13.58ms     3.6 GB/sec    1.00   137.8±10.65ms     3.7 GB/sec
string_non_null/zstd                               1.04    556.9±4.16ms   941.0 MB/sec    1.00    537.9±2.82ms   974.2 MB/sec
string_non_null/zstd_parquet_2                     1.00    504.7±0.42ms  1038.3 MB/sec    1.01    508.5±8.08ms  1030.4 MB/sec
struct_all_null/bloom_filter                       1.00    390.6±1.46µs    40.3 GB/sec    1.01    394.2±1.41µs    39.9 GB/sec
struct_all_null/cdc                                1.00      7.8±0.06ms     2.0 GB/sec    1.02      7.9±0.15ms  2037.6 MB/sec
struct_all_null/default                            1.00    136.6±0.48µs   115.3 GB/sec    1.01    137.7±0.59µs   114.3 GB/sec
struct_all_null/parquet_2                          1.00    137.9±0.49µs   114.2 GB/sec    1.00    137.8±0.56µs   114.3 GB/sec
struct_all_null/zstd                               1.00    187.2±0.68µs    84.1 GB/sec    1.01    188.5±1.13µs    83.6 GB/sec
struct_all_null/zstd_parquet_2                     1.00    172.6±0.83µs    91.2 GB/sec    1.01    174.2±0.87µs    90.4 GB/sec
struct_non_null/bloom_filter                       1.02     46.8±0.15ms   342.0 MB/sec    1.00     46.0±0.13ms   347.9 MB/sec
struct_non_null/cdc                                1.01     46.0±0.81ms   347.7 MB/sec    1.00     45.7±0.12ms   350.2 MB/sec
struct_non_null/default                            1.00     32.1±0.12ms   498.7 MB/sec    1.00     32.2±0.11ms   497.4 MB/sec
struct_non_null/parquet_2                          1.00     40.8±0.12ms   391.9 MB/sec    1.00     40.9±0.12ms   390.9 MB/sec
struct_non_null/zstd                               1.00     40.7±0.11ms   393.4 MB/sec    1.00     40.9±0.10ms   391.7 MB/sec
struct_non_null/zstd_parquet_2                     1.00     54.9±0.17ms   291.7 MB/sec    1.00     55.0±0.12ms   290.9 MB/sec
struct_sparse_99pct_null/bloom_filter              1.00      6.5±0.05ms     2.4 GB/sec    1.01      6.6±0.05ms     2.4 GB/sec
struct_sparse_99pct_null/cdc                       1.03     14.0±0.07ms  1154.6 MB/sec    1.00     13.6±0.12ms  1186.3 MB/sec
struct_sparse_99pct_null/default                   1.00      6.0±0.03ms     2.6 GB/sec    1.00      6.0±0.03ms     2.6 GB/sec
struct_sparse_99pct_null/parquet_2                 1.01      6.1±0.04ms     2.6 GB/sec    1.00      6.0±0.03ms     2.6 GB/sec
struct_sparse_99pct_null/zstd                      1.01      7.5±0.06ms     2.1 GB/sec    1.00      7.4±0.04ms     2.1 GB/sec
struct_sparse_99pct_null/zstd_parquet_2            1.02      6.9±0.04ms     2.3 GB/sec    1.00      6.8±0.03ms     2.3 GB/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 2370.5s
Peak memory 2.7 GiB
Avg memory 2.5 GiB
CPU user 2310.8s
CPU sys 53.5s
Peak spill 0 B

branch

Metric Value
Wall time 2355.5s
Peak memory 2.7 GiB
Avg memory 2.5 GiB
CPU user 2284.3s
CPU sys 67.5s
Peak spill 0 B

File an issue against this benchmark runner

@mapleFU

mapleFU commented Jul 5, 2026

Copy link
Copy Markdown
Member Author

run benchmark arrow_writer

@adriangbot

Copy link
Copy Markdown

@mapleFU

mapleFU commented Jul 6, 2026

Copy link
Copy Markdown
Member Author

@alamb Can we retrigger the benchmarking? I cannot reproducing the regression on my local MacOS machine =_=

@alamb

alamb commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

run benchmark arrow_writer

@alamb

alamb commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

@alamb Can we retrigger the benchmarking? I cannot reproducing the regression on my local MacOS machine =_=

I think the benchmark has been somewhat sensitive recently (I think we have it going so fast it is now very sensitive to subtle changes in environment)

@alamb

alamb commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

@HippoBaro do you have time to help review this PR?

@adriangbot

Copy link
Copy Markdown

🤖 Arrow criterion benchmark running (GKE) | trigger
Instance: c4a-highmem-16 (12 vCPU / 65 GiB) | Linux bench-c4898560437-878-ddflv 6.12.85+ #1 SMP Mon May 11 08:17:35 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 nested-list-optimize-write (09c2b84) to 6035e28 (merge-base) diff
BENCH_NAME=arrow_writer
BENCH_COMMAND=cargo bench --features=arrow,async,test_common,experimental,object_store --bench arrow_writer
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                                   nested-list-optimize-write
-----                                              ----                                   --------------------------
bool/bloom_filter                                  1.00     13.2±0.07ms    19.0 MB/sec    1.00     13.1±0.04ms    19.1 MB/sec
bool/cdc                                           1.00     15.8±0.07ms    15.8 MB/sec    1.00     15.8±0.05ms    15.8 MB/sec
bool/default                                       1.01     11.1±0.07ms    22.6 MB/sec    1.00     11.0±0.04ms    22.7 MB/sec
bool/parquet_2                                     1.00     14.8±0.09ms    16.9 MB/sec    1.00     14.8±0.04ms    16.9 MB/sec
bool/zstd                                          1.01     11.6±0.09ms    21.5 MB/sec    1.00     11.5±0.04ms    21.7 MB/sec
bool/zstd_parquet_2                                1.00     15.2±0.07ms    16.4 MB/sec    1.00     15.2±0.05ms    16.4 MB/sec
bool_non_null/bloom_filter                         1.00      7.1±0.03ms    17.7 MB/sec    1.00      7.0±0.03ms    17.8 MB/sec
bool_non_null/cdc                                  1.00      6.8±0.03ms    18.3 MB/sec    1.00      6.8±0.03ms    18.3 MB/sec
bool_non_null/default                              1.00      4.3±0.03ms    28.9 MB/sec    1.00      4.3±0.02ms    29.1 MB/sec
bool_non_null/parquet_2                            1.00      9.0±0.04ms    13.9 MB/sec    1.01      9.1±0.03ms    13.8 MB/sec
bool_non_null/zstd                                 1.01      4.7±0.02ms    26.8 MB/sec    1.00      4.6±0.02ms    27.0 MB/sec
bool_non_null/zstd_parquet_2                       1.00      9.4±0.03ms    13.3 MB/sec    1.01      9.5±0.03ms    13.1 MB/sec
bool_ree/bloom_filter                              1.01     30.7±0.10ms     6.9 MB/sec    1.00     30.4±0.06ms     7.0 MB/sec
bool_ree/cdc                                       1.01     31.9±0.10ms     6.7 MB/sec    1.00     31.6±0.05ms     6.7 MB/sec
bool_ree/default                                   1.01     28.1±0.08ms     7.6 MB/sec    1.00     27.7±0.04ms     7.7 MB/sec
bool_ree/parquet_2                                 1.01     29.6±0.10ms     7.2 MB/sec    1.00     29.3±0.06ms     7.3 MB/sec
bool_ree/zstd                                      1.02     28.8±0.10ms     7.4 MB/sec    1.00     28.3±0.05ms     7.5 MB/sec
bool_ree/zstd_parquet_2                            1.01     29.9±0.11ms     7.1 MB/sec    1.00     29.6±0.05ms     7.2 MB/sec
fixed_size_binary_ree/bloom_filter                 1.01     69.8±0.25ms    14.4 MB/sec    1.00     69.1±0.34ms    14.6 MB/sec
fixed_size_binary_ree/cdc                          1.01     73.5±0.17ms    13.7 MB/sec    1.00     72.5±0.58ms    13.9 MB/sec
fixed_size_binary_ree/default                      1.01     62.8±0.14ms    16.0 MB/sec    1.00     62.4±0.35ms    16.1 MB/sec
fixed_size_binary_ree/parquet_2                    1.01     79.1±0.70ms    12.7 MB/sec    1.00     78.2±0.39ms    12.9 MB/sec
fixed_size_binary_ree/zstd                         1.01     67.9±0.22ms    14.8 MB/sec    1.00     67.4±0.33ms    14.9 MB/sec
fixed_size_binary_ree/zstd_parquet_2               1.01     79.7±0.32ms    12.6 MB/sec    1.00     79.0±0.35ms    12.7 MB/sec
float_with_nans/bloom_filter                       1.04     96.0±1.67ms   145.9 MB/sec    1.00     92.4±0.31ms   151.4 MB/sec
float_with_nans/cdc                                1.01     82.2±0.44ms   170.3 MB/sec    1.00     81.2±0.90ms   172.4 MB/sec
float_with_nans/default                            1.02     75.2±0.23ms   186.2 MB/sec    1.00     73.6±0.13ms   190.3 MB/sec
float_with_nans/parquet_2                          1.03     96.9±0.46ms   144.6 MB/sec    1.00     93.8±0.21ms   149.2 MB/sec
float_with_nans/zstd                               1.01    112.9±0.46ms   124.0 MB/sec    1.00    111.3±0.12ms   125.8 MB/sec
float_with_nans/zstd_parquet_2                     1.01    132.3±0.23ms   105.8 MB/sec    1.00    130.8±0.20ms   107.0 MB/sec
int32_ree/bloom_filter                             1.01     40.5±0.20ms    10.0 MB/sec    1.00     39.9±0.11ms    10.2 MB/sec
int32_ree/cdc                                      1.01     40.5±0.12ms    10.1 MB/sec    1.00     40.1±0.04ms    10.1 MB/sec
int32_ree/default                                  1.01     36.5±0.13ms    11.1 MB/sec    1.00     36.1±0.05ms    11.3 MB/sec
int32_ree/parquet_2                                1.01     36.5±0.11ms    11.1 MB/sec    1.00     36.2±0.04ms    11.2 MB/sec
int32_ree/zstd                                     1.01     37.1±0.12ms    11.0 MB/sec    1.00     36.8±0.07ms    11.0 MB/sec
int32_ree/zstd_parquet_2                           1.01     37.0±0.12ms    11.0 MB/sec    1.00     36.7±0.08ms    11.1 MB/sec
int32_ree_95pct_null/bloom_filter                  1.00     21.9±0.04ms    18.6 MB/sec    1.00     21.8±0.02ms    18.6 MB/sec
int32_ree_95pct_null/cdc                           1.02     24.6±0.07ms    16.5 MB/sec    1.00     24.1±0.08ms    16.9 MB/sec
int32_ree_95pct_null/default                       1.00     21.5±0.03ms    18.9 MB/sec    1.00     21.5±0.03ms    18.9 MB/sec
int32_ree_95pct_null/parquet_2                     1.00     21.5±0.06ms    18.9 MB/sec    1.00     21.5±0.02ms    18.9 MB/sec
int32_ree_95pct_null/zstd                          1.00     21.8±0.03ms    18.7 MB/sec    1.00     21.8±0.02ms    18.7 MB/sec
int32_ree_95pct_null/zstd_parquet_2                1.01     21.8±0.03ms    18.6 MB/sec    1.00     21.7±0.01ms    18.8 MB/sec
large_string_non_null/bloom_filter                 1.00     72.9±0.12ms     3.4 GB/sec    1.00     73.0±0.15ms     3.4 GB/sec
large_string_non_null/cdc                          1.00    244.5±1.11ms  1047.2 MB/sec    1.00    244.6±1.10ms  1046.8 MB/sec
large_string_non_null/default                      1.00     55.0±0.08ms     4.5 GB/sec    1.00     54.9±0.08ms     4.6 GB/sec
large_string_non_null/parquet_2                    1.00     54.9±0.10ms     4.6 GB/sec    1.00     54.9±0.07ms     4.6 GB/sec
large_string_non_null/zstd                         1.00     55.0±0.10ms     4.5 GB/sec    1.00     54.9±0.09ms     4.6 GB/sec
large_string_non_null/zstd_parquet_2               1.00     55.1±0.10ms     4.5 GB/sec    1.00     54.9±0.07ms     4.6 GB/sec
list_nested/bloom_filter                           1.07    157.6±0.23ms   183.1 MB/sec    1.00    147.1±0.18ms   196.2 MB/sec
list_nested/cdc                                    1.06    174.5±0.21ms   165.4 MB/sec    1.00    164.7±0.15ms   175.1 MB/sec
list_nested/default                                1.08    143.7±0.41ms   200.8 MB/sec    1.00    133.3±0.17ms   216.4 MB/sec
list_nested/parquet_2                              1.07    156.3±0.23ms   184.6 MB/sec    1.00    146.5±0.20ms   196.9 MB/sec
list_nested/zstd                                   1.07    152.3±0.25ms   189.5 MB/sec    1.00    142.4±0.16ms   202.6 MB/sec
list_nested/zstd_parquet_2                         1.06    169.5±0.22ms   170.2 MB/sec    1.00    159.7±0.18ms   180.7 MB/sec
list_primitive/bloom_filter                        1.08    309.6±3.48ms  1761.3 MB/sec    1.00    287.5±1.02ms  1896.7 MB/sec
list_primitive/cdc                                 1.02    329.1±5.33ms  1657.0 MB/sec    1.00    322.1±1.65ms  1693.3 MB/sec
list_primitive/default                             1.09    231.1±1.74ms     2.3 GB/sec    1.00    212.6±1.22ms     2.5 GB/sec
list_primitive/parquet_2                           1.07    252.0±2.37ms     2.1 GB/sec    1.00    234.5±0.23ms     2.3 GB/sec
list_primitive/zstd                                1.01    465.6±1.49ms  1171.3 MB/sec    1.00    461.2±2.02ms  1182.4 MB/sec
list_primitive/zstd_parquet_2                      1.00    459.5±0.37ms  1186.9 MB/sec    1.00    458.2±0.33ms  1190.3 MB/sec
list_primitive_non_null/bloom_filter               1.04   410.0±10.45ms  1327.3 MB/sec    1.00    395.2±4.88ms  1377.1 MB/sec
list_primitive_non_null/cdc                        1.00    410.8±7.86ms  1324.9 MB/sec    1.01   413.2±10.22ms  1317.1 MB/sec
list_primitive_non_null/default                    1.04    279.4±6.41ms  1948.2 MB/sec    1.00    268.2±5.05ms  2029.2 MB/sec
list_primitive_non_null/parquet_2                  1.06    321.3±0.49ms  1693.9 MB/sec    1.00    303.8±0.69ms  1791.3 MB/sec
list_primitive_non_null/zstd                       1.02   698.0±14.52ms   779.7 MB/sec    1.00   683.9±13.94ms   795.8 MB/sec
list_primitive_non_null/zstd_parquet_2             1.02   679.7±12.88ms   800.8 MB/sec    1.00    669.3±0.53ms   813.2 MB/sec
list_primitive_sparse_99pct_null/bloom_filter      1.00     12.4±0.04ms     2.9 GB/sec    1.01     12.6±0.03ms     2.9 GB/sec
list_primitive_sparse_99pct_null/cdc               1.00     23.7±0.07ms  1579.9 MB/sec    1.01     23.9±0.08ms  1563.8 MB/sec
list_primitive_sparse_99pct_null/default           1.00     12.0±0.04ms     3.0 GB/sec    1.02     12.2±0.03ms     3.0 GB/sec
list_primitive_sparse_99pct_null/parquet_2         1.00     12.0±0.03ms     3.0 GB/sec    1.02     12.3±0.03ms     3.0 GB/sec
list_primitive_sparse_99pct_null/zstd              1.00     13.9±0.03ms     2.6 GB/sec    1.02     14.1±0.04ms     2.6 GB/sec
list_primitive_sparse_99pct_null/zstd_parquet_2    1.00     12.2±0.02ms     3.0 GB/sec    1.02     12.4±0.04ms     2.9 GB/sec
list_struct_with_list/bloom_filter                 1.11    314.3±0.92ms   145.1 MB/sec    1.00    284.2±0.42ms   160.4 MB/sec
list_struct_with_list/cdc                          1.09    351.5±1.06ms   129.7 MB/sec    1.00    323.1±0.39ms   141.1 MB/sec
list_struct_with_list/default                      1.11    286.1±0.86ms   159.4 MB/sec    1.00    257.9±0.41ms   176.8 MB/sec
list_struct_with_list/parquet_2                    1.10    303.4±0.78ms   150.3 MB/sec    1.00    275.2±0.43ms   165.7 MB/sec
list_struct_with_list/zstd                         1.10    307.8±0.78ms   148.1 MB/sec    1.00    279.6±0.40ms   163.1 MB/sec
list_struct_with_list/zstd_parquet_2               1.09    327.2±0.95ms   139.4 MB/sec    1.00    299.2±0.71ms   152.4 MB/sec
primitive/bloom_filter                             1.02    149.5±0.83ms   300.3 MB/sec    1.00    146.2±0.36ms   307.0 MB/sec
primitive/cdc                                      1.02    161.3±1.19ms   278.3 MB/sec    1.00    157.6±0.85ms   284.8 MB/sec
primitive/default                                  1.03    119.8±3.32ms   374.4 MB/sec    1.00    116.3±0.20ms   385.8 MB/sec
primitive/parquet_2                                1.02    134.3±1.01ms   334.2 MB/sec    1.00    131.5±0.16ms   341.3 MB/sec
primitive/zstd                                     1.02    149.4±1.17ms   300.3 MB/sec    1.00    146.0±0.19ms   307.5 MB/sec
primitive/zstd_parquet_2                           1.02    168.0±0.52ms   267.1 MB/sec    1.00    165.0±0.23ms   271.9 MB/sec
primitive_all_null/bloom_filter                    1.01    923.7±1.27µs    47.4 GB/sec    1.00    919.0±1.48µs    47.7 GB/sec
primitive_all_null/cdc                             1.00     19.2±0.56ms     2.3 GB/sec    1.00     19.1±0.29ms     2.3 GB/sec
primitive_all_null/default                         1.01    313.6±1.08µs   139.7 GB/sec    1.00    309.6±1.47µs   141.6 GB/sec
primitive_all_null/parquet_2                       1.00    311.7±1.21µs   140.6 GB/sec    1.00    313.2±1.15µs   139.9 GB/sec
primitive_all_null/zstd                            1.02    435.8±0.99µs   100.6 GB/sec    1.00    427.7±1.70µs   102.5 GB/sec
primitive_all_null/zstd_parquet_2                  1.00    397.2±1.34µs   110.3 GB/sec    1.00    396.4±1.27µs   110.6 GB/sec
primitive_non_null/bloom_filter                    1.01    106.2±0.67ms   414.5 MB/sec    1.00    104.6±0.33ms   420.6 MB/sec
primitive_non_null/cdc                             1.01     90.6±0.51ms   485.7 MB/sec    1.00     89.6±0.37ms   491.0 MB/sec
primitive_non_null/default                         1.01     67.5±0.29ms   652.1 MB/sec    1.00     66.8±0.14ms   659.1 MB/sec
primitive_non_null/parquet_2                       1.01     89.5±0.33ms   491.8 MB/sec    1.00     89.0±0.20ms   494.4 MB/sec
primitive_non_null/zstd                            1.01     98.2±0.24ms   447.9 MB/sec    1.00     97.6±0.16ms   450.8 MB/sec
primitive_non_null/zstd_parquet_2                  1.00    123.2±0.42ms   357.2 MB/sec    1.00    122.8±0.23ms   358.4 MB/sec
primitive_sparse_99pct_null/bloom_filter           1.00     12.0±0.06ms     3.7 GB/sec    1.00     11.9±0.06ms     3.7 GB/sec
primitive_sparse_99pct_null/cdc                    1.02     30.8±0.37ms  1454.8 MB/sec    1.00     30.1±0.26ms  1490.8 MB/sec
primitive_sparse_99pct_null/default                1.00     10.6±0.02ms     4.1 GB/sec    1.00     10.6±0.03ms     4.1 GB/sec
primitive_sparse_99pct_null/parquet_2              1.00     10.6±0.03ms     4.1 GB/sec    1.01     10.7±0.03ms     4.1 GB/sec
primitive_sparse_99pct_null/zstd                   1.00     14.0±0.04ms     3.1 GB/sec    1.00     14.0±0.07ms     3.1 GB/sec
primitive_sparse_99pct_null/zstd_parquet_2         1.00     12.5±0.04ms     3.5 GB/sec    1.00     12.5±0.04ms     3.5 GB/sec
short_string_non_null/bloom_filter                 1.03     28.2±0.09ms   424.8 MB/sec    1.00     27.5±0.08ms   436.4 MB/sec
short_string_non_null/cdc                          1.00     19.8±0.07ms   605.3 MB/sec    1.00     19.8±0.05ms   606.2 MB/sec
short_string_non_null/default                      1.01     15.8±0.06ms   761.3 MB/sec    1.00     15.7±0.04ms   765.7 MB/sec
short_string_non_null/parquet_2                    1.05     26.5±0.07ms   452.4 MB/sec    1.00     25.3±0.06ms   474.8 MB/sec
short_string_non_null/zstd                         1.00     35.3±0.09ms   339.7 MB/sec    1.00     35.4±0.09ms   339.1 MB/sec
short_string_non_null/zstd_parquet_2               1.04     29.4±0.08ms   408.8 MB/sec    1.00     28.1±0.06ms   426.9 MB/sec
string/bloom_filter                                1.00   214.0±18.41ms     2.4 GB/sec    1.05   225.3±22.11ms     2.3 GB/sec
string/cdc                                         1.01    219.5±5.32ms     2.3 GB/sec    1.00    217.4±6.07ms     2.4 GB/sec
string/default                                     1.11   133.2±19.48ms     3.8 GB/sec    1.00   120.1±11.62ms     4.3 GB/sec
string/parquet_2                                   1.04    128.4±1.13ms     4.0 GB/sec    1.00    123.6±0.37ms     4.1 GB/sec
string/zstd                                        1.10   460.1±21.02ms  1139.4 MB/sec    1.00    417.7±3.03ms  1255.2 MB/sec
string/zstd_parquet_2                              1.02    402.5±9.12ms  1302.5 MB/sec    1.00    395.0±0.33ms  1327.1 MB/sec
string_and_binary_view/bloom_filter                1.02     64.4±0.31ms   500.5 MB/sec    1.00     63.4±0.15ms   508.9 MB/sec
string_and_binary_view/cdc                         1.01     59.1±0.24ms   545.4 MB/sec    1.00     58.8±0.12ms   548.5 MB/sec
string_and_binary_view/default                     1.01     48.9±0.24ms   660.0 MB/sec    1.00     48.2±0.10ms   669.5 MB/sec
string_and_binary_view/parquet_2                   1.03     60.5±0.24ms   533.1 MB/sec    1.00     58.9±0.12ms   547.6 MB/sec
string_and_binary_view/zstd                        1.01     85.4±0.24ms   377.8 MB/sec    1.00     84.8±0.36ms   380.2 MB/sec
string_and_binary_view/zstd_parquet_2              1.02     74.4±0.23ms   433.3 MB/sec    1.00     72.9±0.52ms   442.3 MB/sec
string_dictionary/bloom_filter                     1.02     91.2±0.42ms     2.8 GB/sec    1.00     89.7±0.19ms     2.9 GB/sec
string_dictionary/cdc                              1.01     54.2±0.51ms     4.8 GB/sec    1.00     53.5±0.44ms     4.8 GB/sec
string_dictionary/default                          1.00     48.8±0.88ms     5.3 GB/sec    1.00     49.0±0.11ms     5.3 GB/sec
string_dictionary/parquet_2                        1.01     54.3±0.49ms     4.7 GB/sec    1.00     53.7±0.47ms     4.8 GB/sec
string_dictionary/zstd                             1.00    209.4±0.75ms  1261.1 MB/sec    1.00    209.1±0.25ms  1263.2 MB/sec
string_dictionary/zstd_parquet_2                   1.00    198.6±0.22ms  1330.3 MB/sec    1.00    198.4±0.21ms  1331.0 MB/sec
string_non_null/bloom_filter                       1.00   245.5±14.87ms     2.1 GB/sec    1.00   245.6±11.99ms     2.1 GB/sec
string_non_null/cdc                                1.01    271.1±7.65ms  1933.1 MB/sec    1.00    268.0±8.43ms  1955.2 MB/sec
string_non_null/default                            1.00   124.5±11.43ms     4.1 GB/sec    1.08    134.8±9.38ms     3.8 GB/sec
string_non_null/parquet_2                          1.00   142.5±11.78ms     3.6 GB/sec    1.16    164.7±0.88ms     3.1 GB/sec
string_non_null/zstd                               1.00    558.9±6.45ms   937.5 MB/sec    1.00    559.9±9.01ms   935.9 MB/sec
string_non_null/zstd_parquet_2                     1.00    510.3±5.72ms  1026.8 MB/sec    1.00    509.8±9.33ms  1027.9 MB/sec
string_ree/bloom_filter                            1.00    153.9±1.71ms   106.6 MB/sec    1.00    154.6±2.04ms   106.2 MB/sec
string_ree/cdc                                     1.00    226.0±0.74ms    72.6 MB/sec    1.00    225.3±1.56ms    72.8 MB/sec
string_ree/default                                 1.00    126.4±1.95ms   129.8 MB/sec    1.02    129.1±0.91ms   127.1 MB/sec
string_ree/parquet_2                               1.02    177.6±0.38ms    92.4 MB/sec    1.00    173.3±0.39ms    94.7 MB/sec
string_ree/zstd                                    1.01    175.5±0.57ms    93.5 MB/sec    1.00    174.2±1.52ms    94.2 MB/sec
string_ree/zstd_parquet_2                          1.02    192.4±0.44ms    85.3 MB/sec    1.00    188.2±0.44ms    87.2 MB/sec
string_ree_95pct_null/bloom_filter                 1.01     26.2±0.14ms    53.7 MB/sec    1.00     26.0±0.06ms    54.0 MB/sec
string_ree_95pct_null/cdc                          1.00     32.5±0.12ms    43.3 MB/sec    1.00     32.4±0.06ms    43.4 MB/sec
string_ree_95pct_null/default                      1.00     24.7±0.10ms    57.0 MB/sec    1.00     24.6±0.04ms    57.3 MB/sec
string_ree_95pct_null/parquet_2                    1.00     24.7±0.09ms    57.0 MB/sec    1.00     24.6±0.04ms    57.3 MB/sec
string_ree_95pct_null/zstd                         1.01     25.5±0.12ms    55.1 MB/sec    1.00     25.4±0.05ms    55.4 MB/sec
string_ree_95pct_null/zstd_parquet_2               1.01     25.4±0.11ms    55.3 MB/sec    1.00     25.3±0.05ms    55.6 MB/sec
struct_all_null/bloom_filter                       1.01    389.6±1.12µs    40.4 GB/sec    1.00    384.7±1.12µs    40.9 GB/sec
struct_all_null/cdc                                1.00      7.7±0.16ms     2.0 GB/sec    1.01      7.8±0.06ms     2.0 GB/sec
struct_all_null/default                            1.02    134.7±0.47µs   116.9 GB/sec    1.00    132.0±0.61µs   119.3 GB/sec
struct_all_null/parquet_2                          1.00    133.9±0.54µs   117.6 GB/sec    1.01    135.4±0.50µs   116.3 GB/sec
struct_all_null/zstd                               1.00    184.7±0.51µs    85.3 GB/sec    1.00    184.8±0.71µs    85.2 GB/sec
struct_all_null/zstd_parquet_2                     1.00    169.8±0.57µs    92.7 GB/sec    1.01    171.3±0.47µs    91.9 GB/sec
struct_non_null/bloom_filter                       1.00     46.0±0.13ms   347.8 MB/sec    1.00     45.9±0.11ms   349.0 MB/sec
struct_non_null/cdc                                1.00     45.2±0.13ms   354.0 MB/sec    1.00     45.2±0.14ms   354.0 MB/sec
struct_non_null/default                            1.00     31.8±0.09ms   502.6 MB/sec    1.00     31.7±0.10ms   504.7 MB/sec
struct_non_null/parquet_2                          1.00     40.6±0.11ms   394.3 MB/sec    1.00     40.6±0.11ms   393.7 MB/sec
struct_non_null/zstd                               1.00     40.5±0.09ms   395.1 MB/sec    1.00     40.4±0.09ms   395.6 MB/sec
struct_non_null/zstd_parquet_2                     1.00     54.5±0.10ms   293.4 MB/sec    1.00     54.7±0.15ms   292.6 MB/sec
struct_sparse_99pct_null/bloom_filter              1.01      6.4±0.02ms     2.4 GB/sec    1.00      6.4±0.03ms     2.5 GB/sec
struct_sparse_99pct_null/cdc                       1.03     14.3±0.10ms  1123.9 MB/sec    1.00     13.9±0.08ms  1161.8 MB/sec
struct_sparse_99pct_null/default                   1.01      5.9±0.01ms     2.7 GB/sec    1.00      5.9±0.01ms     2.7 GB/sec
struct_sparse_99pct_null/parquet_2                 1.00      5.9±0.01ms     2.7 GB/sec    1.00      5.9±0.01ms     2.7 GB/sec
struct_sparse_99pct_null/zstd                      1.01      7.3±0.01ms     2.2 GB/sec    1.00      7.3±0.02ms     2.2 GB/sec
struct_sparse_99pct_null/zstd_parquet_2            1.01      6.7±0.01ms     2.4 GB/sec    1.00      6.6±0.01ms     2.4 GB/sec

Resource Usage

base (merge-base)

Metric Value
Wall time 2865.6s
Peak memory 2.8 GiB
Avg memory 2.6 GiB
CPU user 2758.6s
CPU sys 100.5s
Peak spill 0 B

branch

Metric Value
Wall time 2805.6s
Peak memory 2.7 GiB
Avg memory 2.6 GiB
CPU user 2710.0s
CPU sys 91.3s
Peak spill 0 B

File an issue against this benchmark runner

@HippoBaro

Copy link
Copy Markdown
Contributor

Thank you @mapleFU for the PR 🙇 I'll review this tomorrow!

@HippoBaro HippoBaro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This looks good to me. For nested lists the gains are real. Thanks @mapleFU

Comment on lines +481 to +483
// `==` would also work here: the child is written before the
// parent, so no entry within the batch has rep < ctx.rep_level.
// Benchmarks show no difference, so keep the more defensive `<=`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think the invariant holds, but let's have

debug_assert!(*rep >= ctx.rep_level)

here for good measure?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

done

@mapleFU

mapleFU commented Jul 11, 2026

Copy link
Copy Markdown
Member Author

Sorry for late reply, I'm so busy in these weeks, I've addressed the comments now

@mapleFU

mapleFU commented Jul 17, 2026

Copy link
Copy Markdown
Member Author

@alamb should we move this forward or this is blocked?

@alamb

alamb commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

@alamb should we move this forward or this is blocked?

I don't think it is blocked, it just needs a review. I will try and find to do so

@alamb

alamb commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Oh, actually I see now that @HippoBaro already did. Awesome

@alamb alamb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I took another look and I think it also looks good to me -- thank you @HippoBaro and @mapleFU

@alamb
alamb merged commit 665462d into apache:main Jul 20, 2026
16 checks passed
@mapleFU
mapleFU deleted the nested-list-optimize-write branch July 21, 2026 03:32
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.

optimize(parquet): write list without repeated child write call

6 participants