@@ -28,6 +28,7 @@ extern crate arrow;
2828use arrow:: datatypes:: * ;
2929use arrow:: util:: test_util:: seedable_rng;
3030use arrow:: { array:: * , util:: bench_util:: * } ;
31+ use arrow_buffer:: ScalarBuffer ;
3132use arrow_select:: interleave:: interleave;
3233use std:: hint;
3334use 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