1919extern crate criterion;
2020extern crate arrow;
2121
22+ use std:: sync:: Arc ;
23+
2224use crate :: criterion:: Criterion ;
25+ use arrow:: {
26+ array:: { Int32Array , ListArray , ListViewArray } ,
27+ buffer:: { OffsetBuffer , ScalarBuffer } ,
28+ datatypes:: { DataType , Field } ,
29+ } ;
2330use datafusion_expr:: lit;
2431use datafusion_functions_nested:: expr_fn:: { array_replace_all, make_array} ;
32+ use datafusion_functions_nested:: reverse:: array_reverse_inner;
2533use std:: hint:: black_box;
2634
2735fn criterion_benchmark ( c : & mut Criterion ) {
2836 // Construct large arrays for benchmarking
29-
30- let array_len = 100000000 ;
31-
37+ let array_len = 100000 ;
3238 let array = ( 0 ..array_len) . map ( |_| lit ( 2_i64 ) ) . collect :: < Vec < _ > > ( ) ;
3339 let list_array = make_array ( vec ! [ make_array( array) ; 3 ] ) ;
3440 let from_array = make_array ( vec ! [ lit( 2_i64 ) ; 3 ] ) ;
@@ -37,7 +43,6 @@ fn criterion_benchmark(c: &mut Criterion) {
3743 let expected_array = list_array. clone ( ) ;
3844
3945 // Benchmark array functions
40-
4146 c. bench_function ( "array_replace" , |b| {
4247 b. iter ( || {
4348 assert_eq ! (
@@ -50,6 +55,38 @@ fn criterion_benchmark(c: &mut Criterion) {
5055 )
5156 } )
5257 } ) ;
58+
59+ // Construct large arrays for reverse
60+ let step_size: usize = 1000 ;
61+ let offsets: Vec < i32 > = ( 0 ..array_len as i32 )
62+ . step_by ( step_size. try_into ( ) . unwrap ( ) )
63+ . collect ( ) ;
64+ let offsets = ScalarBuffer :: from ( offsets) ;
65+ let sizes: Vec < i32 > = vec ! [ step_size as i32 ; array_len / step_size as usize ] ;
66+ let values = ( 0 ..array_len as i32 ) . collect :: < Vec < i32 > > ( ) ;
67+
68+ // Reverse list array
69+ let list_array = ListArray :: new (
70+ Arc :: new ( Field :: new ( "a" , DataType :: Int32 , false ) ) ,
71+ OffsetBuffer :: new ( offsets. clone ( ) ) ,
72+ Arc :: new ( Int32Array :: from ( values. clone ( ) ) ) ,
73+ None ,
74+ ) ;
75+ c. bench_function ( "array_reverse_list" , |b| {
76+ b. iter ( || array_reverse_inner ( & [ Arc :: new ( list_array. clone ( ) ) ] ) )
77+ } ) ;
78+
79+ // Reverse list view array
80+ let list_view_array = ListViewArray :: new (
81+ Arc :: new ( Field :: new ( "a" , DataType :: Int32 , false ) ) ,
82+ offsets,
83+ ScalarBuffer :: from ( sizes) ,
84+ Arc :: new ( Int32Array :: from ( values) ) ,
85+ None ,
86+ ) ;
87+ c. bench_function ( "array_reverse_list_view" , |b| {
88+ b. iter ( || array_reverse_inner ( & [ Arc :: new ( list_view_array. clone ( ) ) ] ) )
89+ } ) ;
5390}
5491
5592criterion_group ! ( benches, criterion_benchmark) ;
0 commit comments