• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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