1 use criterion::black_box;
2
3 use winnow::combinator::repeat;
4 use winnow::prelude::*;
5 use winnow::token::one_of;
6 use winnow::token::tag;
7
next_slice(c: &mut criterion::Criterion)8 fn next_slice(c: &mut criterion::Criterion) {
9 let mut group = c.benchmark_group("next_slice");
10
11 let name = "ascii";
12 let sample = "h".repeat(100);
13 let sample = sample.as_str();
14 group.bench_with_input(
15 criterion::BenchmarkId::new("char", name),
16 sample,
17 |b, sample| {
18 b.iter(|| black_box(parser_ascii_char.parse_peek(black_box(sample)).unwrap()));
19 },
20 );
21 group.bench_with_input(
22 criterion::BenchmarkId::new("str", name),
23 sample,
24 |b, sample| {
25 b.iter(|| black_box(parser_ascii_str.parse_peek(black_box(sample)).unwrap()));
26 },
27 );
28 group.bench_with_input(
29 criterion::BenchmarkId::new("one_of", name),
30 sample,
31 |b, sample| {
32 b.iter(|| black_box(parser_ascii_one_of.parse_peek(black_box(sample)).unwrap()));
33 },
34 );
35 group.bench_with_input(
36 criterion::BenchmarkId::new("tag_char", name),
37 sample,
38 |b, sample| {
39 b.iter(|| black_box(parser_ascii_tag_char.parse_peek(black_box(sample)).unwrap()));
40 },
41 );
42 group.bench_with_input(
43 criterion::BenchmarkId::new("tag_str", name),
44 sample,
45 |b, sample| {
46 b.iter(|| black_box(parser_ascii_tag_str.parse_peek(black_box(sample)).unwrap()));
47 },
48 );
49
50 let name = "utf8";
51 let sample = "".repeat(100);
52 let sample = sample.as_str();
53 group.bench_with_input(
54 criterion::BenchmarkId::new("char", name),
55 sample,
56 |b, sample| {
57 b.iter(|| black_box(parser_utf8_char.parse_peek(black_box(sample)).unwrap()));
58 },
59 );
60 group.bench_with_input(
61 criterion::BenchmarkId::new("str", name),
62 sample,
63 |b, sample| {
64 b.iter(|| black_box(parser_utf8_str.parse_peek(black_box(sample)).unwrap()));
65 },
66 );
67 group.bench_with_input(
68 criterion::BenchmarkId::new("one_of", name),
69 sample,
70 |b, sample| {
71 b.iter(|| black_box(parser_utf8_one_of.parse_peek(black_box(sample)).unwrap()));
72 },
73 );
74 group.bench_with_input(
75 criterion::BenchmarkId::new("tag_char", name),
76 sample,
77 |b, sample| {
78 b.iter(|| black_box(parser_utf8_tag_char.parse_peek(black_box(sample)).unwrap()));
79 },
80 );
81 group.bench_with_input(
82 criterion::BenchmarkId::new("tag_str", name),
83 sample,
84 |b, sample| {
85 b.iter(|| black_box(parser_utf8_tag_str.parse_peek(black_box(sample)).unwrap()));
86 },
87 );
88
89 group.finish();
90 }
91
parser_ascii_char(input: &mut &str) -> PResult<usize>92 fn parser_ascii_char(input: &mut &str) -> PResult<usize> {
93 repeat(0.., 'h').parse_next(input)
94 }
95
parser_ascii_str(input: &mut &str) -> PResult<usize>96 fn parser_ascii_str(input: &mut &str) -> PResult<usize> {
97 repeat(0.., "h").parse_next(input)
98 }
99
parser_ascii_one_of(input: &mut &str) -> PResult<usize>100 fn parser_ascii_one_of(input: &mut &str) -> PResult<usize> {
101 repeat(0.., one_of('h')).parse_next(input)
102 }
103
parser_ascii_tag_char(input: &mut &str) -> PResult<usize>104 fn parser_ascii_tag_char(input: &mut &str) -> PResult<usize> {
105 repeat(0.., tag('h')).parse_next(input)
106 }
107
parser_ascii_tag_str(input: &mut &str) -> PResult<usize>108 fn parser_ascii_tag_str(input: &mut &str) -> PResult<usize> {
109 repeat(0.., tag("h")).parse_next(input)
110 }
111
parser_utf8_char(input: &mut &str) -> PResult<usize>112 fn parser_utf8_char(input: &mut &str) -> PResult<usize> {
113 repeat(0.., '').parse_next(input)
114 }
115
parser_utf8_str(input: &mut &str) -> PResult<usize>116 fn parser_utf8_str(input: &mut &str) -> PResult<usize> {
117 repeat(0.., "").parse_next(input)
118 }
119
parser_utf8_one_of(input: &mut &str) -> PResult<usize>120 fn parser_utf8_one_of(input: &mut &str) -> PResult<usize> {
121 repeat(0.., one_of('')).parse_next(input)
122 }
123
parser_utf8_tag_char(input: &mut &str) -> PResult<usize>124 fn parser_utf8_tag_char(input: &mut &str) -> PResult<usize> {
125 repeat(0.., tag('')).parse_next(input)
126 }
127
parser_utf8_tag_str(input: &mut &str) -> PResult<usize>128 fn parser_utf8_tag_str(input: &mut &str) -> PResult<usize> {
129 repeat(0.., tag("")).parse_next(input)
130 }
131
132 criterion::criterion_group!(benches, next_slice);
133 criterion::criterion_main!(benches);
134