#![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] = &[ // Empty handling "", // Barely used "1", // kstring's max small-string size "123456789012345", // Boundary conditions for most small-string optimizations "1234567890123456789012", "12345678901234567890123", "123456789012345678901234", "1234567890123456789012345", // Small heap "1234567890123456789012345678901234567890123456789012345678901234", // Large heap "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", ]; #[cfg(feature = "unstable_bench_subset")] pub static FIXTURES: &[&str] = &[ "0123456789", "01234567890123456789012345678901234567890123456789012345678901234567890123456789", ]; fn bench_clone(c: &mut Criterion) { let mut group = c.benchmark_group("clone"); 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.clone()) }, ); group.bench_with_input(BenchmarkId::new("StringCow::Owned", len), &len, |b, _| { let fixture = String::from(*fixture); let uut = StringCow::Owned(fixture); let uut = criterion::black_box(uut); b.iter(|| uut.clone()) }); 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.clone()) }, ); group.bench_with_input(BenchmarkId::new("KString::from_ref", len), &len, |b, _| { let fixture = String::from(*fixture); let uut = kstring::KString::from_ref(&fixture); let uut = criterion::black_box(uut); b.iter(|| uut.clone()) }); group.bench_with_input( BenchmarkId::new("KString::from_string", len), &len, |b, _| { let fixture = String::from(*fixture); let uut = kstring::KString::from_string(fixture); let uut = criterion::black_box(uut); b.iter(|| uut.clone()) }, ); #[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.clone()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringCow::from_ref", len), &len, |b, _| { let fixture = String::from(*fixture); let uut = kstring::KStringCow::from_ref(&fixture); let uut = criterion::black_box(uut); b.iter(|| uut.clone()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringCow::from_string", len), &len, |b, _| { let fixture = String::from(*fixture); let uut = kstring::KStringCow::from_string(fixture); let uut = criterion::black_box(uut); b.iter(|| uut.clone()) }, ); #[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.clone()) }, ); #[cfg(not(feature = "unstable_bench_subset"))] group.bench_with_input( BenchmarkId::new("KStringRef::from_ref", len), &len, |b, _| { let fixture = String::from(*fixture); let uut = kstring::KStringRef::from_ref(&fixture); let uut = criterion::black_box(uut); b.iter(|| uut.clone()) }, ); } group.finish(); } criterion_group!(benches, bench_clone); criterion_main!(benches);