17
17
18
18
#[ macro_use]
19
19
extern crate criterion;
20
+ use arrow:: util:: test_util:: seedable_rng;
20
21
use criterion:: Criterion ;
21
22
22
23
extern crate arrow;
@@ -27,6 +28,8 @@ use arrow::{array::*, datatypes::Float32Type, datatypes::Int32Type};
27
28
use arrow_buffer:: IntervalMonthDayNano ;
28
29
use arrow_string:: like:: * ;
29
30
use arrow_string:: regexp:: regexp_is_match_utf8_scalar;
31
+ use rand:: rngs:: StdRng ;
32
+ use rand:: Rng ;
30
33
31
34
const SIZE : usize = 65536 ;
32
35
@@ -55,6 +58,14 @@ fn bench_regexp_is_match_utf8_scalar(arr_a: &StringArray, value_b: &str) {
55
58
. unwrap ( ) ;
56
59
}
57
60
61
+ fn make_string_array ( size : usize , rng : & mut StdRng ) -> impl Iterator < Item = Option < String > > + ' _ {
62
+ ( 0 ..size) . map ( |_| {
63
+ let len = rng. gen_range ( 0 ..64 ) ;
64
+ let bytes = ( 0 ..len) . map ( |_| rng. gen_range ( 0 ..128 ) ) . collect ( ) ;
65
+ Some ( String :: from_utf8 ( bytes) . unwrap ( ) )
66
+ } )
67
+ }
68
+
58
69
fn add_benchmark ( c : & mut Criterion ) {
59
70
let arr_a = create_primitive_array_with_seed :: < Float32Type > ( SIZE , 0.0 , 42 ) ;
60
71
let arr_b = create_primitive_array_with_seed :: < Float32Type > ( SIZE , 0.0 , 43 ) ;
@@ -63,6 +74,7 @@ fn add_benchmark(c: &mut Criterion) {
63
74
let arr_month_day_nano_b = create_month_day_nano_array_with_seed ( SIZE , 0.0 , 43 ) ;
64
75
65
76
let arr_string = create_string_array :: < i32 > ( SIZE , 0.0 ) ;
77
+
66
78
let scalar = Float32Array :: from ( vec ! [ 1.0 ] ) ;
67
79
68
80
c. bench_function ( "eq Float32" , |b| b. iter ( || eq ( & arr_a, & arr_b) ) ) ;
@@ -138,6 +150,45 @@ fn add_benchmark(c: &mut Criterion) {
138
150
b. iter ( || eq ( & arr_month_day_nano_b, & scalar) . unwrap ( ) )
139
151
} ) ;
140
152
153
+ let mut rng = seedable_rng ( ) ;
154
+ let mut array_gen = make_string_array ( 1024 * 1024 * 8 , & mut rng) ;
155
+ let string_left = StringArray :: from_iter ( array_gen) ;
156
+ let string_view_left = StringViewArray :: from_iter ( string_left. iter ( ) ) ;
157
+
158
+ // reference to the same rng to make sure we generate **different** array data,
159
+ // ow. the left and right will be identical
160
+ array_gen = make_string_array ( 1024 * 1024 * 8 , & mut rng) ;
161
+ let string_right = StringArray :: from_iter ( array_gen) ;
162
+ let string_view_right = StringViewArray :: from_iter ( string_right. iter ( ) ) ;
163
+
164
+ c. bench_function ( "eq scalar StringArray" , |b| {
165
+ b. iter ( || {
166
+ eq (
167
+ & Scalar :: new ( StringArray :: from_iter_values ( [ "xxxx" ] ) ) ,
168
+ & string_left,
169
+ )
170
+ . unwrap ( )
171
+ } )
172
+ } ) ;
173
+
174
+ c. bench_function ( "eq scalar StringViewArray" , |b| {
175
+ b. iter ( || {
176
+ eq (
177
+ & Scalar :: new ( StringViewArray :: from_iter_values ( [ "xxxx" ] ) ) ,
178
+ & string_view_left,
179
+ )
180
+ . unwrap ( )
181
+ } )
182
+ } ) ;
183
+
184
+ c. bench_function ( "eq StringArray StringArray" , |b| {
185
+ b. iter ( || eq ( & string_left, & string_right) . unwrap ( ) )
186
+ } ) ;
187
+
188
+ c. bench_function ( "eq StringViewArray StringViewArray" , |b| {
189
+ b. iter ( || eq ( & string_view_left, & string_view_right) . unwrap ( ) )
190
+ } ) ;
191
+
141
192
c. bench_function ( "like_utf8 scalar equals" , |b| {
142
193
b. iter ( || bench_like_utf8_scalar ( & arr_string, "xxxx" ) )
143
194
} ) ;
0 commit comments