use criterion::*;
use regex::{bytes::Regex as BytesRegex, Regex, RegexSet};
fn bench_simple_regexes(c: &mut Criterion) {
let mut group = c.benchmark_group("regex");
let pattern = "?/static/adv/foobar/asd?q=1";
let rules = vec![
Regex::new(r"(?:[^\\w\\d\\._%-])/static/ad-").unwrap(),
Regex::new(r"(?:[^\\w\\d\\._%-])/static/ad/.*").unwrap(),
Regex::new(r"(?:[^\\w\\d\\._%-])/static/ads/.*").unwrap(),
Regex::new(r"(?:[^\\w\\d\\._%-])/static/adv/.*").unwrap(),
];
group.bench_function("list", move |b| {
b.iter(|| {
for rule in rules.iter() {
if rule.is_match(&pattern) {
true;
} else {
false;
}
}
})
});
group.finish();
}
fn bench_joined_regex(c: &mut Criterion) {
let mut group = c.benchmark_group("regex");
let pattern = "?/static/adv/foobar/asd?q=1";
let rule = Regex::new(r"(?:([^\\w\\d\\._%-])/static/ad-)|(?:([^\\w\\d\\._%-])/static/ad/.*)(?:([^\\w\\d\\._%-])/static/ads/.*)(?:([^\\w\\d\\._%-])/static/adv/.*)").unwrap();
group.bench_function("joined", move |b| b.iter(|| rule.is_match(&pattern)));
group.finish();
}
fn bench_joined_bytes_regex(c: &mut Criterion) {
let mut group = c.benchmark_group("regex");
let pattern = "?/static/adv/foobar/asd?q=1";
let rule = BytesRegex::new(r"(?:([^\\w\\d\\._%-])/static/ad-)|(?:([^\\w\\d\\._%-])/static/ad/.*)(?:([^\\w\\d\\._%-])/static/ads/.*)(?:([^\\w\\d\\._%-])/static/adv/.*)").unwrap();
group.bench_function("u8", move |b| b.iter(|| rule.is_match(pattern.as_bytes())));
group.finish();
}
fn bench_regex_set(c: &mut Criterion) {
let mut group = c.benchmark_group("regex");
let pattern = "?/static/adv/foobar/asd?q=1";
let set = RegexSet::new(&[
r"(?:[^\\w\\d\\._%-])/static/ad-",
r"(?:[^\\w\\d\\._%-])/static/ad/.*",
r"(?:[^\\w\\d\\._%-])/static/ads/.*",
r"(?:[^\\w\\d\\._%-])/static/adv/.*",
])
.unwrap();
group.bench_function("set", move |b| b.iter(|| set.is_match(&pattern)));
group.finish();
}
criterion_group!(
benches,
bench_simple_regexes,
bench_joined_regex,
bench_joined_bytes_regex,
bench_regex_set
);
criterion_main!(benches);