use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn log_str(msg: &str) {
let _ = black_box(msg.len());
}
fn check_contains_string(items: &[String], search: &String) -> bool {
black_box(items.contains(search))
}
fn check_contains_str(items: &[String], search: &str) -> bool {
black_box(items.iter().any(|s| s.as_str() == search))
}
fn benchmark_str_vs_string(c: &mut Criterion) {
let mut group = c.benchmark_group("string_params");
group.bench_function("log_with_str", |b| {
b.iter(|| {
log_str(black_box("Hello, World!"));
});
});
group.bench_function("log_with_string_conversion", |b| {
b.iter(|| {
let msg = black_box("Hello, World!".to_string());
let _ = black_box(msg.len());
});
});
let items: Vec<String> = (0..100).map(|i| format!("item_{}", i)).collect();
let search = "item_50".to_string();
group.bench_function("contains_with_string", |b| {
b.iter(|| {
check_contains_string(black_box(&items), black_box(&search));
});
});
group.bench_function("contains_with_str_workaround", |b| {
b.iter(|| {
check_contains_str(black_box(&items), black_box("item_50"));
});
});
group.finish();
}
fn benchmark_allocation_overhead(c: &mut Criterion) {
let mut group = c.benchmark_group("allocation_overhead");
group.bench_function("string_allocation", |b| {
b.iter(|| {
let _s = black_box("Hello, World!".to_string());
});
});
group.bench_function("string_literal", |b| {
b.iter(|| {
let _s: &str = black_box("Hello, World!");
});
});
group.finish();
}
criterion_group!(
benches,
benchmark_str_vs_string,
benchmark_allocation_overhead
);
criterion_main!(benches);