use criterion::{Criterion, criterion_group, criterion_main};
use std::{cmp, hint::black_box};
fn splitn(input: &str, n: usize) -> Vec<String> {
if n == 0 {
return vec![input.to_string()];
}
let size = input.len().div_ceil(n);
let mut rtn = Vec::with_capacity(size);
let mut i = 0;
while i < input.len() {
let true_len = cmp::min(n, input.len() - i);
rtn.push(input[i..(i + true_len)].to_string());
i += true_len;
}
rtn
}
fn splitn_byte(input: &str, n: usize) -> Vec<&str> {
if n == 0 {
return vec![input];
}
input
.as_bytes()
.chunks(n)
.map(str::from_utf8)
.collect::<Result<Vec<&str>, _>>()
.unwrap()
}
fn criterion_benchmark(c: &mut Criterion) {
let mut group = c.benchmark_group("splitn");
group.bench_function("splitn AEFF??00FE 2", |b| {
b.iter(|| splitn(black_box("AEFF??00FE"), black_box(2)))
});
group.bench_function("splitn_byte AEFF??00FE 2", |b| {
b.iter(|| splitn_byte(black_box("AEFF??00FE"), black_box(2)))
});
group.finish();
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);