extern crate criterion;
use arrow::util::bench_util::create_string_array_with_len;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use datafusion_expr::ColumnarValue;
use datafusion_functions::encoding;
use std::sync::Arc;
fn criterion_benchmark(c: &mut Criterion) {
let decode = encoding::decode();
for size in [1024, 4096, 8192] {
let str_array = Arc::new(create_string_array_with_len::<i32>(size, 0.2, 32));
c.bench_function(&format!("base64_decode/{size}"), |b| {
let method = ColumnarValue::Scalar("base64".into());
let encoded = encoding::encode()
.invoke_batch(
&[ColumnarValue::Array(str_array.clone()), method.clone()],
size,
)
.unwrap();
let args = vec![encoded, method];
b.iter(|| {
black_box(decode.invoke_batch(&args, size).unwrap())
})
});
c.bench_function(&format!("hex_decode/{size}"), |b| {
let method = ColumnarValue::Scalar("hex".into());
let encoded = encoding::encode()
.invoke_batch(
&[ColumnarValue::Array(str_array.clone()), method.clone()],
size,
)
.unwrap();
let args = vec![encoded, method];
b.iter(|| {
black_box(decode.invoke_batch(&args, size).unwrap())
})
});
}
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);