use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use feedparser_rs::{Email, MimeType, Url};
use std::hint::black_box;
use std::sync::Arc;
fn bench_mimetype_clone(c: &mut Criterion) {
let mut group = c.benchmark_group("MimeType_clone");
let mime_types = [
"text/html", "text/plain", "application/xml", "application/rss+xml", "application/atom+xml", "application/json", "audio/mpeg", "video/mp4", "image/jpeg", "application/pdf", ];
for mime_str in &mime_types {
let mime = MimeType::new(*mime_str);
group.bench_with_input(BenchmarkId::new("Arc_str", mime_str), &mime, |b, m| {
b.iter(|| black_box(m.clone()));
});
let string = mime_str.to_string();
group.bench_with_input(BenchmarkId::new("String", mime_str), &string, |b, s| {
b.iter(|| black_box(s.clone()));
});
let arc_string = Arc::new(mime_str.to_string());
group.bench_with_input(
BenchmarkId::new("Arc_String", mime_str),
&arc_string,
|b, a| b.iter(|| black_box(Arc::clone(a))),
);
}
group.finish();
}
fn bench_mimetype_creation(c: &mut Criterion) {
let mut group = c.benchmark_group("MimeType_creation");
let mime_types = ["text/html", "application/rss+xml", "application/atom+xml"];
for mime_str in &mime_types {
group.bench_with_input(
BenchmarkId::new("Arc_from_str", mime_str),
mime_str,
|b, s| b.iter(|| MimeType::new(black_box(*s))),
);
group.bench_with_input(
BenchmarkId::new("String_from_str", mime_str),
mime_str,
|b, s| b.iter(|| black_box(*s).to_string()),
);
group.bench_with_input(
BenchmarkId::new("Arc_str_from_str", mime_str),
mime_str,
|b, s| b.iter(|| Arc::<str>::from(black_box(*s))),
);
}
group.finish();
}
fn bench_url_clone(c: &mut Criterion) {
let mut group = c.benchmark_group("Url_clone");
let urls = [
"https://example.com", "https://example.com/feed.xml", "https://example.com/feed.xml?param=value", "https://example.com/blog/2024/12/article-title", ];
for url_str in &urls {
let url = Url::new(*url_str);
group.bench_with_input(BenchmarkId::new("String", url_str), &url, |b, u| {
b.iter(|| black_box(u.clone()));
});
let arc_url = Arc::<str>::from(*url_str);
group.bench_with_input(BenchmarkId::new("Arc_str", url_str), &arc_url, |b, a| {
b.iter(|| black_box(Arc::clone(a)));
});
}
group.finish();
}
fn bench_email_clone(c: &mut Criterion) {
let mut group = c.benchmark_group("Email_clone");
let emails = [
"user@example.com", "john.doe@example.com", "very.long.email@subdomain.example.com", ];
for email_str in &emails {
let email = Email::new(*email_str);
group.bench_with_input(BenchmarkId::new("String", email_str), &email, |b, e| {
b.iter(|| black_box(e.clone()));
});
let arc_email = Arc::<str>::from(*email_str);
group.bench_with_input(
BenchmarkId::new("Arc_str", email_str),
&arc_email,
|b, a| b.iter(|| black_box(Arc::clone(a))),
);
}
group.finish();
}
fn bench_breakeven_analysis(c: &mut Criterion) {
let mut group = c.benchmark_group("breakeven_analysis");
let mime_str = "application/rss+xml";
let clone_counts = [1, 2, 5, 10, 20, 50, 100];
for &n_clones in &clone_counts {
group.bench_with_input(BenchmarkId::new("Arc_str", n_clones), &n_clones, |b, &n| {
b.iter(|| {
let mime = MimeType::new(black_box(mime_str));
for _ in 0..n {
let _ = black_box(mime.clone());
}
});
});
group.bench_with_input(BenchmarkId::new("String", n_clones), &n_clones, |b, &n| {
b.iter(|| {
let s = black_box(mime_str).to_string();
for _ in 0..n {
let _ = black_box(s.clone());
}
});
});
}
group.finish();
}
criterion_group!(
benches,
bench_mimetype_clone,
bench_mimetype_creation,
bench_url_clone,
bench_email_clone,
bench_breakeven_analysis,
);
criterion_main!(benches);