This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/main by this push:
new c5fed03500 Add benchmark for ListView interleave (#9738)
c5fed03500 is described below
commit c5fed03500bfd332a5cf2e6e2f1df66aafe996f5
Author: Vegard Stikbakke <[email protected]>
AuthorDate: Thu Apr 16 17:34:31 2026 +0200
Add benchmark for ListView interleave (#9738)
Ref https://github.com/apache/arrow-rs/pull/9558#discussion_r3092871713
---------
Co-authored-by: Alfonso Subiotto Marques <[email protected]>
---
arrow/benches/interleave_kernels.rs | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/arrow/benches/interleave_kernels.rs
b/arrow/benches/interleave_kernels.rs
index 8daf42a144..0688bb79ad 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;
@@ -121,6 +122,34 @@ fn add_benchmark(c: &mut Criterion) {
let list_i64_no_nulls =
create_primitive_list_array_with_seed::<i32, Int64Type>(8192, 0.0,
0.0, 20, 42);
+ let list_view_i64: ListViewArray =
+ create_primitive_list_array_with_seed::<i32, Int64Type>(8192, 0.1,
0.1, 20, 42).into();
+ let list_view_i64_no_nulls: ListViewArray =
+ create_primitive_list_array_with_seed::<i32, Int64Type>(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<i32> = (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),
@@ -143,6 +172,9 @@ fn add_benchmark(c: &mut Criterion) {
),
("list<i64>(0.1,0.1,20)", &list_i64),
("list<i64>(0.0,0.0,20)", &list_i64_no_nulls),
+ ("list_view<i64>(0.1,0.1,20)", &list_view_i64),
+ ("list_view<i64>(0.0,0.0,20)", &list_view_i64_no_nulls),
+ ("list_view_overlapping<i64>(80x,20)", &list_view_overlapping),
];
for (prefix, base) in cases {