blob: 83b26a30a2bd3d8804f02464f52b32849469ce98 [file] [log] [blame]
use criterion::black_box;
use criterion::criterion_group;
use criterion::criterion_main;
use criterion::Bencher;
use criterion::Criterion;
use criterion::Fun;
use tinystr::{TinyStr16, TinyStr4, TinyStr8};
static STRINGS_4: &[&str] = &[
"US", "GB", "AR", "Hans", "CN", "AT", "PL", "FR", "AT", "Cyrl", "SR", "NO", "FR", "MK", "UK",
];
static STRINGS_8: &[&str] = &[
"Latn", "windows", "AR", "Hans", "macos", "AT", "pl", "FR", "en", "Cyrl", "SR", "NO", "419",
"und", "UK",
];
static STRINGS_16: &[&str] = &[
"Latn",
"windows",
"AR",
"Hans",
"macos",
"AT",
"infiniband",
"FR",
"en",
"Cyrl",
"FromIntegral",
"NO",
"419",
"MacintoshOSX2019",
"UK",
];
macro_rules! bench_block {
($c:expr, $name:expr, $action:ident) => {
let funcs = vec![
Fun::new("String", $action!(String)),
Fun::new("TinyStr4", $action!(TinyStr4)),
Fun::new("TinyStr8", $action!(TinyStr8)),
Fun::new("TinyStr16", $action!(TinyStr16)),
];
$c.bench_functions(&format!("{}/4", $name), funcs, STRINGS_4);
let funcs = vec![
Fun::new("String", $action!(String)),
Fun::new("TinyStr8", $action!(TinyStr8)),
Fun::new("TinyStr16", $action!(TinyStr16)),
];
$c.bench_functions(&format!("{}/8", $name), funcs, STRINGS_8);
let funcs = vec![
Fun::new("String", $action!(String)),
Fun::new("TinyStr16", $action!(TinyStr16)),
];
$c.bench_functions(&format!("{}/16", $name), funcs, STRINGS_16);
};
}
macro_rules! convert_to_ascii {
($ty:ty, $action:ident) => {
|b: &mut Bencher, inputs: &&[&str]| {
let raw: Vec<$ty> = inputs.iter().map(|s| s.parse::<$ty>().unwrap()).collect();
b.iter(move || {
for s in &raw {
let _ = black_box(s.$action());
}
})
}
};
}
fn convert_to_ascii_lowercase(c: &mut Criterion) {
macro_rules! ctal {
($ty:ty) => {
convert_to_ascii!($ty, to_ascii_lowercase)
};
}
bench_block!(c, "convert_to_ascii_lowercase", ctal);
}
fn convert_to_ascii_uppercase(c: &mut Criterion) {
macro_rules! ctau {
($ty:ty) => {
convert_to_ascii!($ty, to_ascii_uppercase)
};
}
bench_block!(c, "convert_to_ascii_uppercase", ctau);
}
trait ExtToAsciiTitlecase {
#[inline(always)]
fn to_ascii_titlecase(&self) -> String;
}
impl ExtToAsciiTitlecase for str {
fn to_ascii_titlecase(&self) -> String {
let mut result = self.to_ascii_lowercase();
result[0..1].make_ascii_uppercase();
result
}
}
fn convert_to_ascii_titlecase(c: &mut Criterion) {
macro_rules! ctat {
($ty:ty) => {
convert_to_ascii!($ty, to_ascii_titlecase)
};
}
bench_block!(c, "convert_to_ascii_titlecase", ctat);
}
trait ExtIsAsciiAlphanumeric {
#[inline(always)]
fn is_ascii_alphanumeric(&self) -> bool;
}
impl ExtIsAsciiAlphanumeric for str {
fn is_ascii_alphanumeric(&self) -> bool {
self.chars().all(|c| c.is_ascii_alphanumeric())
}
}
fn test_is_ascii_alphanumeric(c: &mut Criterion) {
macro_rules! tiaa {
($ty:ty) => {
|b: &mut Bencher, inputs: &&[&str]| {
let raw: Vec<$ty> = inputs.iter().map(|s| s.parse::<$ty>().unwrap()).collect();
b.iter(move || {
for s in &raw {
let _ = black_box(s.is_ascii_alphanumeric());
}
})
}
};
}
bench_block!(c, "test_is_ascii_alphanumeric", tiaa);
}
fn test_eq(c: &mut Criterion) {
macro_rules! te {
($ty:ty) => {
|b: &mut Bencher, inputs: &&[&str]| {
let raw: Vec<$ty> = inputs.iter().map(|s| s.parse::<$ty>().unwrap()).collect();
b.iter(move || {
for s in &raw {
for l in &raw {
let _ = black_box(s == l);
}
}
})
}
};
}
bench_block!(c, "test_eq", te);
}
criterion_group!(
benches,
convert_to_ascii_lowercase,
convert_to_ascii_uppercase,
convert_to_ascii_titlecase,
test_is_ascii_alphanumeric,
test_eq,
);
criterion_main!(benches);