Skip to content

Commit 13c9e90

Browse files
authored
Add eq benchmark for StringArray/StringViewArray (#5924)
* add neq/eq benchmark for String/ViewArray * move bench to comparsion kernel * clean unnecessary dep * make clippy happy
1 parent 7ef6be4 commit 13c9e90

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

arrow/benches/comparison_kernels.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#[macro_use]
1919
extern crate criterion;
20+
use arrow::util::test_util::seedable_rng;
2021
use criterion::Criterion;
2122

2223
extern crate arrow;
@@ -27,6 +28,8 @@ use arrow::{array::*, datatypes::Float32Type, datatypes::Int32Type};
2728
use arrow_buffer::IntervalMonthDayNano;
2829
use arrow_string::like::*;
2930
use arrow_string::regexp::regexp_is_match_utf8_scalar;
31+
use rand::rngs::StdRng;
32+
use rand::Rng;
3033

3134
const SIZE: usize = 65536;
3235

@@ -55,6 +58,14 @@ fn bench_regexp_is_match_utf8_scalar(arr_a: &StringArray, value_b: &str) {
5558
.unwrap();
5659
}
5760

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+
5869
fn add_benchmark(c: &mut Criterion) {
5970
let arr_a = create_primitive_array_with_seed::<Float32Type>(SIZE, 0.0, 42);
6071
let arr_b = create_primitive_array_with_seed::<Float32Type>(SIZE, 0.0, 43);
@@ -63,6 +74,7 @@ fn add_benchmark(c: &mut Criterion) {
6374
let arr_month_day_nano_b = create_month_day_nano_array_with_seed(SIZE, 0.0, 43);
6475

6576
let arr_string = create_string_array::<i32>(SIZE, 0.0);
77+
6678
let scalar = Float32Array::from(vec![1.0]);
6779

6880
c.bench_function("eq Float32", |b| b.iter(|| eq(&arr_a, &arr_b)));
@@ -138,6 +150,45 @@ fn add_benchmark(c: &mut Criterion) {
138150
b.iter(|| eq(&arr_month_day_nano_b, &scalar).unwrap())
139151
});
140152

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+
141192
c.bench_function("like_utf8 scalar equals", |b| {
142193
b.iter(|| bench_like_utf8_scalar(&arr_string, "xxxx"))
143194
});

0 commit comments

Comments
 (0)