Skip to content

Commit c5fed03

Browse files
vegarstiasubiotto
andauthored
Add benchmark for ListView interleave (#9738)
Ref #9558 (comment) --------- Co-authored-by: Alfonso Subiotto Marques <alfonso.subiotto@polarsignals.com>
1 parent d7d9ad3 commit c5fed03

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

arrow/benches/interleave_kernels.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extern crate arrow;
2828
use arrow::datatypes::*;
2929
use arrow::util::test_util::seedable_rng;
3030
use arrow::{array::*, util::bench_util::*};
31+
use arrow_buffer::ScalarBuffer;
3132
use arrow_select::interleave::interleave;
3233
use std::hint;
3334
use std::sync::Arc;
@@ -121,6 +122,34 @@ fn add_benchmark(c: &mut Criterion) {
121122
let list_i64_no_nulls =
122123
create_primitive_list_array_with_seed::<i32, Int64Type>(8192, 0.0, 0.0, 20, 42);
123124

125+
let list_view_i64: ListViewArray =
126+
create_primitive_list_array_with_seed::<i32, Int64Type>(8192, 0.1, 0.1, 20, 42).into();
127+
let list_view_i64_no_nulls: ListViewArray =
128+
create_primitive_list_array_with_seed::<i32, Int64Type>(8192, 0.0, 0.0, 20, 42).into();
129+
130+
// ListView with overlapping offset/size ranges: 100 unique element ranges of
131+
// 20 elements each, with 80 rows sharing each range (8000 rows, 2000 backing elements).
132+
let list_view_overlapping = {
133+
let num_unique = 100;
134+
let rows_per_unique = 80;
135+
let elems_per_row = 20;
136+
let total_rows = num_unique * rows_per_unique;
137+
let values = Arc::new(Int64Array::from_iter_values(
138+
0..((num_unique * elems_per_row) as i64),
139+
));
140+
let offsets: Vec<i32> = (0..total_rows)
141+
.map(|i| ((i / rows_per_unique) * elems_per_row) as i32)
142+
.collect();
143+
let sizes = vec![elems_per_row as i32; total_rows];
144+
ListViewArray::new(
145+
Arc::new(Field::new_list_field(DataType::Int64, false)),
146+
ScalarBuffer::from(offsets),
147+
ScalarBuffer::from(sizes),
148+
values,
149+
None,
150+
)
151+
};
152+
124153
let cases: &[(&str, &dyn Array)] = &[
125154
("i32(0.0)", &i32),
126155
("i32(0.5)", &i32_opt),
@@ -143,6 +172,9 @@ fn add_benchmark(c: &mut Criterion) {
143172
),
144173
("list<i64>(0.1,0.1,20)", &list_i64),
145174
("list<i64>(0.0,0.0,20)", &list_i64_no_nulls),
175+
("list_view<i64>(0.1,0.1,20)", &list_view_i64),
176+
("list_view<i64>(0.0,0.0,20)", &list_view_i64_no_nulls),
177+
("list_view_overlapping<i64>(80x,20)", &list_view_overlapping),
146178
];
147179

148180
for (prefix, base) in cases {

0 commit comments

Comments
 (0)