1 use criterion::black_box;
2 
3 use winnow::combinator::repeat;
4 use winnow::prelude::*;
5 use winnow::token::take_until;
6 
find_slice(c: &mut criterion::Criterion)7 fn find_slice(c: &mut criterion::Criterion) {
8     let empty = "";
9     let start_byte = "\r".repeat(100);
10     let start_slice = "\r\n".repeat(100);
11     let small = format!("{:>10}\r\n", "").repeat(100);
12     let large = format!("{:>10000}\r\n", "").repeat(100);
13 
14     let data = [
15         ("empty", (empty, empty)),
16         ("start", (&start_byte, &start_slice)),
17         ("medium", (&small, &small)),
18         ("large", (&large, &large)),
19     ];
20     let mut group = c.benchmark_group("find_slice");
21     for (name, samples) in data {
22         group.bench_with_input(
23             criterion::BenchmarkId::new("byte", name),
24             samples.0,
25             |b, sample| {
26                 b.iter(|| black_box(parser_byte.parse_peek(black_box(sample)).unwrap()));
27             },
28         );
29 
30         group.bench_with_input(
31             criterion::BenchmarkId::new("slice", name),
32             samples.1,
33             |b, sample| {
34                 b.iter(|| black_box(parser_slice.parse_peek(black_box(sample)).unwrap()));
35             },
36         );
37     }
38     group.finish();
39 }
40 
parser_byte(input: &mut &str) -> PResult<usize>41 fn parser_byte(input: &mut &str) -> PResult<usize> {
42     repeat(0.., (take_until(0.., "\r"), "\r")).parse_next(input)
43 }
44 
parser_slice(input: &mut &str) -> PResult<usize>45 fn parser_slice(input: &mut &str) -> PResult<usize> {
46     repeat(0.., (take_until(0.., "\r\n"), "\r\n")).parse_next(input)
47 }
48 
49 criterion::criterion_group!(benches, find_slice);
50 criterion::criterion_main!(benches);
51