1 use aho_corasick::{AhoCorasick, AhoCorasickBuilder};
2 use criterion::{black_box, Criterion};
3
4 use crate::input::{words_15000, words_5000};
5 use crate::{define, define_long};
6
7 /// Benchmarks that measure the performance of constructing an Aho-Corasick
8 /// automaton.
all(c: &mut Criterion)9 pub fn all(c: &mut Criterion) {
10 define_build::<String>(c, false, "empty", vec![]);
11 define_build(c, false, "onebyte", vec!["a"]);
12 define_build(c, false, "twobytes", vec!["a", "b"]);
13 define_build(
14 c,
15 false,
16 "many-short",
17 vec![
18 "ADL", "ADl", "AdL", "Adl", "BAK", "BAk", "BAK", "BaK", "Bak",
19 "BaK", "HOL", "HOl", "HoL", "Hol", "IRE", "IRe", "IrE", "Ire",
20 "JOH", "JOh", "JoH", "Joh", "SHE", "SHe", "ShE", "She", "WAT",
21 "WAt", "WaT", "Wat", "aDL", "aDl", "adL", "adl", "bAK", "bAk",
22 "bAK", "baK", "bak", "baK", "hOL", "hOl", "hoL", "hol", "iRE",
23 "iRe", "irE", "ire", "jOH", "jOh", "joH", "joh", "sHE", "sHe",
24 "shE", "she", "wAT", "wAt", "waT", "wat", "ſHE", "ſHe", "ſhE",
25 "ſhe",
26 ],
27 );
28 define_build(c, true, "5000words", words_5000());
29 define_build(c, true, "15000words", words_15000());
30 }
31
define_build<B: AsRef<[u8]>>( c: &mut Criterion, long: bool, bench_name: &str, patterns: Vec<B>, )32 fn define_build<B: AsRef<[u8]>>(
33 c: &mut Criterion,
34 long: bool,
35 bench_name: &str,
36 patterns: Vec<B>,
37 ) {
38 let patterns: Vec<Vec<u8>> =
39 patterns.into_iter().map(|b| b.as_ref().to_vec()).collect();
40
41 let pats = patterns.clone();
42 let name = format!("nfa/{}", bench_name);
43 if long {
44 define_long(c, "build", &name, &[], move |b| {
45 b.iter(|| black_box(AhoCorasick::new(&pats)))
46 });
47 } else {
48 define(c, "build", &name, &[], move |b| {
49 b.iter(|| black_box(AhoCorasick::new(&pats)))
50 });
51 }
52
53 let pats = patterns.clone();
54 let name = format!("dfa/{}", bench_name);
55 if long {
56 define_long(c, "build", &name, &[], move |b| {
57 b.iter(|| {
58 black_box(AhoCorasickBuilder::new().dfa(true).build(&pats))
59 })
60 });
61 } else {
62 define(c, "build", &name, &[], move |b| {
63 b.iter(|| {
64 black_box(AhoCorasickBuilder::new().dfa(true).build(&pats))
65 })
66 });
67 }
68 }
69