1 use winnow::combinator::repeat;
2 use winnow::prelude::*;
3
4 mod parser;
5 mod parser_str;
6
bench_ini(c: &mut criterion::Criterion)7 fn bench_ini(c: &mut criterion::Criterion) {
8 let str = "[owner]
9 name=John Doe
10 organization=Acme Widgets Inc.
11
12 [database]
13 server=192.0.2.62
14 port=143
15 file=payroll.dat
16 \0";
17
18 let mut group = c.benchmark_group("ini");
19 group.throughput(criterion::Throughput::Bytes(str.len() as u64));
20 group.bench_function(criterion::BenchmarkId::new("bytes", str.len()), |b| {
21 b.iter(|| parser::categories.parse_peek(str.as_bytes()).unwrap());
22 });
23 group.bench_function(criterion::BenchmarkId::new("str", str.len()), |b| {
24 b.iter(|| parser_str::categories.parse_peek(str).unwrap())
25 });
26 }
27
bench_ini_keys_and_values(c: &mut criterion::Criterion)28 fn bench_ini_keys_and_values(c: &mut criterion::Criterion) {
29 let str = "server=192.0.2.62
30 port=143
31 file=payroll.dat
32 \0";
33
34 fn acc<'s>(i: &mut parser::Stream<'s>) -> PResult<Vec<(&'s str, &'s str)>> {
35 repeat(0.., parser::key_value).parse_next(i)
36 }
37
38 let mut group = c.benchmark_group("ini keys and values");
39 group.throughput(criterion::Throughput::Bytes(str.len() as u64));
40 group.bench_function(criterion::BenchmarkId::new("bytes", str.len()), |b| {
41 b.iter(|| acc.parse_peek(str.as_bytes()).unwrap());
42 });
43 }
44
bench_ini_key_value(c: &mut criterion::Criterion)45 fn bench_ini_key_value(c: &mut criterion::Criterion) {
46 let str = "server=192.0.2.62\n";
47
48 let mut group = c.benchmark_group("ini key value");
49 group.throughput(criterion::Throughput::Bytes(str.len() as u64));
50 group.bench_function(criterion::BenchmarkId::new("bytes", str.len()), |b| {
51 b.iter(|| parser::key_value.parse_peek(str.as_bytes()).unwrap());
52 });
53 }
54
55 criterion::criterion_group!(
56 benches,
57 bench_ini,
58 bench_ini_keys_and_values,
59 bench_ini_key_value
60 );
61 criterion::criterion_main!(benches);
62