From 224882683b3f20a05cdb9483dd69df42ddb610b8 Mon Sep 17 00:00:00 2001 From: Vegard Stikbakke Date: Thu, 16 Apr 2026 13:42:49 +0200 Subject: [PATCH 1/3] Add benchmark for ListView interleave --- arrow/benches/interleave_kernels.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arrow/benches/interleave_kernels.rs b/arrow/benches/interleave_kernels.rs index 8daf42a14414..182f48f5a646 100644 --- a/arrow/benches/interleave_kernels.rs +++ b/arrow/benches/interleave_kernels.rs @@ -121,6 +121,11 @@ fn add_benchmark(c: &mut Criterion) { let list_i64_no_nulls = create_primitive_list_array_with_seed::(8192, 0.0, 0.0, 20, 42); + let list_view_i64: ListViewArray = + create_primitive_list_array_with_seed::(8192, 0.1, 0.1, 20, 42).into(); + let list_view_i64_no_nulls: ListViewArray = + create_primitive_list_array_with_seed::(8192, 0.0, 0.0, 20, 42).into(); + let cases: &[(&str, &dyn Array)] = &[ ("i32(0.0)", &i32), ("i32(0.5)", &i32_opt), @@ -143,6 +148,8 @@ fn add_benchmark(c: &mut Criterion) { ), ("list(0.1,0.1,20)", &list_i64), ("list(0.0,0.0,20)", &list_i64_no_nulls), + ("list_view(0.1,0.1,20)", &list_view_i64), + ("list_view(0.0,0.0,20)", &list_view_i64_no_nulls), ]; for (prefix, base) in cases { From d5473f0a24bbd0e7cc4a2edcfc996291738fc242 Mon Sep 17 00:00:00 2001 From: Alfonso Subiotto Marques Date: Thu, 16 Apr 2026 14:20:46 +0200 Subject: [PATCH 2/3] Add overlapping ListView interleave benchmark case --- arrow/benches/interleave_kernels.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/arrow/benches/interleave_kernels.rs b/arrow/benches/interleave_kernels.rs index 182f48f5a646..c5978c73a6fd 100644 --- a/arrow/benches/interleave_kernels.rs +++ b/arrow/benches/interleave_kernels.rs @@ -28,6 +28,7 @@ extern crate arrow; use arrow::datatypes::*; use arrow::util::test_util::seedable_rng; use arrow::{array::*, util::bench_util::*}; +use arrow_buffer::ScalarBuffer; use arrow_select::interleave::interleave; use std::hint; use std::sync::Arc; @@ -126,6 +127,29 @@ fn add_benchmark(c: &mut Criterion) { let list_view_i64_no_nulls: ListViewArray = create_primitive_list_array_with_seed::(8192, 0.0, 0.0, 20, 42).into(); + // ListView with overlapping offset/size ranges: 100 unique element ranges of + // 20 elements each, with 80 rows sharing each range (8000 rows, 2000 backing elements). + let list_view_overlapping = { + let num_unique = 100; + let rows_per_unique = 80; + let elems_per_row = 20; + let total_rows = num_unique * rows_per_unique; + let values = Arc::new(Int64Array::from_iter_values( + 0..((num_unique * elems_per_row) as i64), + )); + let offsets: Vec = (0..total_rows) + .map(|i| ((i / rows_per_unique) * elems_per_row) as i32) + .collect(); + let sizes = vec![elems_per_row as i32; total_rows]; + ListViewArray::new( + Arc::new(Field::new_list_field(DataType::Int64, false)), + ScalarBuffer::from(offsets), + ScalarBuffer::from(sizes), + values, + None, + ) + }; + let cases: &[(&str, &dyn Array)] = &[ ("i32(0.0)", &i32), ("i32(0.5)", &i32_opt), @@ -150,6 +174,10 @@ fn add_benchmark(c: &mut Criterion) { ("list(0.0,0.0,20)", &list_i64_no_nulls), ("list_view(0.1,0.1,20)", &list_view_i64), ("list_view(0.0,0.0,20)", &list_view_i64_no_nulls), + ( + "list_view_overlapping(80x,20)", + &list_view_overlapping, + ), ]; for (prefix, base) in cases { From 6c506e0d0ef58553d7daa30affe8ee17a422e1c2 Mon Sep 17 00:00:00 2001 From: Vegard Stikbakke Date: Thu, 16 Apr 2026 14:23:21 +0200 Subject: [PATCH 3/3] Format --- arrow/benches/interleave_kernels.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/arrow/benches/interleave_kernels.rs b/arrow/benches/interleave_kernels.rs index c5978c73a6fd..0688bb79adb1 100644 --- a/arrow/benches/interleave_kernels.rs +++ b/arrow/benches/interleave_kernels.rs @@ -174,10 +174,7 @@ fn add_benchmark(c: &mut Criterion) { ("list(0.0,0.0,20)", &list_i64_no_nulls), ("list_view(0.1,0.1,20)", &list_view_i64), ("list_view(0.0,0.0,20)", &list_view_i64_no_nulls), - ( - "list_view_overlapping(80x,20)", - &list_view_overlapping, - ), + ("list_view_overlapping(80x,20)", &list_view_overlapping), ]; for (prefix, base) in cases {