#![allow( clippy::clone_on_copy, clippy::useless_conversion, clippy::clone_double_ref )] use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; type StringCow<'s> = std::borrow::Cow<'s, str>; #[cfg(not(feature = "unstable_bench_subset"))] pub static FIXTURES: &[&str] = &[ "", "0", "01", "012", "0123", "01234", "012345", "0123456", "01234567", "012345678", "0123456789", "01234567890123456789", "0123456789012345678901234567890123456789", "01234567890123456789012345678901234567890123456789012345678901234567890123456789", ]; #[cfg(feature = "unstable_bench_subset")] pub static FIXTURES: &[&str] = &[ "0123456789", "01234567890123456789012345678901234567890123456789012345678901234567890123456789", ]; // Note: this is meant to measure the overhead for accessing the underlying str. We shouldn't try // to optimize *just* the case being measured here. fn bench_access(c: &mut Criterion) { let mut group = c.benchmark_group("access"); for fixture in FIXTURES { let len = fixture.len(); group.throughput(Throughput::Bytes(len as u64)); group.bench_with_input( BenchmarkId::new("StringCow::Borrowed", len), &len, |b, _| { let uut = StringCow::Borrowed(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); group.bench_with_input(BenchmarkId::new("StringCow::Owned", len), &len, |b, _| { let uut = StringCow::Owned(String::from(*fixture)); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }); group.bench_with_input( BenchmarkId::new("KString::from_static", len), &len, |b, _| { let uut = kstring::KString::from_static(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); group.bench_with_input(BenchmarkId::new("KString::from_ref", len), &len, |b, _| { let uut = kstring::KString::from_ref(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }); group.bench_with_input( BenchmarkId::new("KString::from_string", len), &len, |b, _| { let uut = kstring::KString::from_string(String::from(*fixture)); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringCow::from_static", len), &len, |b, _| { let uut = kstring::KStringCow::from_static(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringCow::from_ref", len), &len, |b, _| { let uut = kstring::KStringCow::from_ref(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringCow::from_string", len), &len, |b, _| { let uut = kstring::KStringCow::from_string(String::from(*fixture)); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringRef::from_static", len), &len, |b, _| { let uut = kstring::KStringRef::from_static(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringRef::from_ref", len), &len, |b, _| { let uut = kstring::KStringRef::from_ref(*fixture); let uut = criterion::black_box(uut); b.iter(|| uut.is_empty()) }, ); } group.finish(); } criterion_group!(benches, bench_access); criterion_main!(benches);