extern crate criterion;
mod helper;
use arrow::datatypes::{DataType, Field};
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use datafusion_expr::ScalarFunctionArgs;
use helper::gen_string_array;
use std::sync::Arc;
fn criterion_benchmark(c: &mut Criterion) {
let ascii = datafusion_functions::string::ascii();
const N_ROWS: usize = 8192;
const STR_LEN: usize = 16;
const UTF8_DENSITY_OF_ALL_ASCII: f32 = 0.0;
const NORMAL_UTF8_DENSITY: f32 = 0.8;
for null_density in [0.0, 0.5] {
let args_string_ascii = gen_string_array(
N_ROWS,
STR_LEN,
null_density,
UTF8_DENSITY_OF_ALL_ASCII,
false,
);
let arg_fields =
vec![Field::new("a", args_string_ascii[0].data_type(), true).into()];
let return_field = Field::new("f", DataType::Utf8, true).into();
c.bench_function(
format!("ascii/string_ascii_only (null_density={null_density})").as_str(),
|b| {
b.iter(|| {
black_box(ascii.invoke_with_args(ScalarFunctionArgs {
args: args_string_ascii.clone(),
arg_fields: arg_fields.clone(),
number_rows: N_ROWS,
return_field: Arc::clone(&return_field),
}))
})
},
);
let args_string_utf8 =
gen_string_array(N_ROWS, STR_LEN, null_density, NORMAL_UTF8_DENSITY, false);
let arg_fields =
vec![Field::new("a", args_string_utf8[0].data_type(), true).into()];
let return_field = Field::new("f", DataType::Utf8, true).into();
c.bench_function(
format!("ascii/string_utf8 (null_density={null_density})").as_str(),
|b| {
b.iter(|| {
black_box(ascii.invoke_with_args(ScalarFunctionArgs {
args: args_string_utf8.clone(),
arg_fields: arg_fields.clone(),
number_rows: N_ROWS,
return_field: Arc::clone(&return_field),
}))
})
},
);
let args_string_view_ascii = gen_string_array(
N_ROWS,
STR_LEN,
null_density,
UTF8_DENSITY_OF_ALL_ASCII,
true,
);
let arg_fields =
vec![Field::new("a", args_string_view_ascii[0].data_type(), true).into()];
let return_field = Field::new("f", DataType::Utf8, true).into();
c.bench_function(
format!("ascii/string_view_ascii_only (null_density={null_density})")
.as_str(),
|b| {
b.iter(|| {
black_box(ascii.invoke_with_args(ScalarFunctionArgs {
args: args_string_view_ascii.clone(),
arg_fields: arg_fields.clone(),
number_rows: N_ROWS,
return_field: Arc::clone(&return_field),
}))
})
},
);
let args_string_view_utf8 =
gen_string_array(N_ROWS, STR_LEN, null_density, NORMAL_UTF8_DENSITY, true);
let arg_fields =
vec![Field::new("a", args_string_view_utf8[0].data_type(), true).into()];
let return_field = Field::new("f", DataType::Utf8, true).into();
c.bench_function(
format!("ascii/string_view_utf8 (null_density={null_density})").as_str(),
|b| {
b.iter(|| {
black_box(ascii.invoke_with_args(ScalarFunctionArgs {
args: args_string_view_utf8.clone(),
arg_fields: arg_fields.clone(),
number_rows: N_ROWS,
return_field: Arc::clone(&return_field),
}))
})
},
);
}
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);