1 use criterion::{black_box, criterion_group, criterion_main, Criterion};
2 use regex::Regex;
3 use wildmatch::WildMatch;
4 
5 const TEXT: &str = "Lorem ipsum dolor sit amet, \
6 consetetur sadipscing elitr, sed diam nonumy eirmod tempor \
7 invidunt ut labore et dolore magna aliquyam erat, sed diam \
8 voluptua. At vero eos et accusam et justo duo dolores et ea \
9 rebum. Stet clita kasd gubergren, no sea takimata sanctus est \
10 Lorem ipsum dolor sit amet.";
11 
12 const FULL_TEXT_PATTERN: &str = TEXT;
13 const FULL_TEXT_REGEX: &str = "^Lorem ipsum dolor sit amet, \
14 consetetur sadipscing elitr, sed diam nonumy eirmod tempor \
15 invidunt ut labore et dolore magna aliquyam erat, sed diam \
16 voluptua\\. At vero eos et accusam et justo duo dolores et ea \
17 rebum\\. Stet clita kasd gubergren, no sea takimata sanctus est \
18 Lorem ipsum dolor sit amet\\.$";
19 
20 const COMPLEX_PATTERN: &str = "Lorem?ipsum*dolore*ea* ?????ata*.";
21 const COMPLEX_REGEX: &str = "^Lorem.ipsum.*dolore.*ea.* .....ata.*\\.$";
22 
23 const MOST_COMPLEX_PATTERN: &str = "?a*b*?**c?d****?e*f*g*?*h?i*?*?**j*******k";
24 const MOST_COMPLEX_REGEX: &str =
25     "^.a.*b.*..*.*c.d.*.*.*.*.e.*f.*g.*..*h.i.*..*..*.*j.*.*.*.*.*.*.*k$";
26 
compiling(c: &mut Criterion)27 pub fn compiling(c: &mut Criterion) {
28     let mut group = c.benchmark_group("compiling");
29 
30     group.bench_function("compile text (wildmatch)", |b| {
31         b.iter(|| WildMatch::new(black_box(FULL_TEXT_PATTERN)))
32     });
33     group.bench_function("compile complex (wildmatch)", |b| {
34         b.iter(|| WildMatch::new(black_box(MOST_COMPLEX_PATTERN)))
35     });
36 
37     group.bench_function("compile text (regex)", |b| {
38         b.iter(|| Regex::new(black_box(FULL_TEXT_REGEX)).unwrap())
39     });
40     group.bench_function("compile complex (regex)", |b| {
41         b.iter(|| Regex::new(black_box(MOST_COMPLEX_REGEX)).unwrap())
42     });
43 }
44 
matching(c: &mut Criterion)45 pub fn matching(c: &mut Criterion) {
46     let pattern1 = WildMatch::new(FULL_TEXT_PATTERN);
47     let pattern2 = WildMatch::new(COMPLEX_PATTERN);
48     let regex1 = Regex::new(FULL_TEXT_REGEX).unwrap();
49     let regex2 = Regex::new(COMPLEX_REGEX).unwrap();
50 
51     let mut group = c.benchmark_group("matching");
52 
53     group.bench_function("match text (wildmatch)", |b| {
54         b.iter(|| pattern1 == black_box(TEXT))
55     });
56     group.bench_function("match complex (wildmatch)", |b| {
57         b.iter(|| pattern2 == black_box(TEXT))
58     });
59 
60     group.bench_function("match text (regex)", |b| {
61         b.iter(|| regex1.is_match(black_box(TEXT)))
62     });
63     group.bench_function("match complex (regex)", |b| {
64         b.iter(|| regex2.is_match(black_box(TEXT)))
65     });
66 }
67 
68 criterion_group!(benches, compiling, matching);
69 criterion_main!(benches);
70