blob: a9b92d3d6342e3cf893b3f6bf77730fb0c079138 [file] [log] [blame]
#![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);