1 use winnow::prelude::*;
2 use winnow::Partial;
3 
4 mod json;
5 mod parser;
6 mod parser_dispatch;
7 mod parser_partial;
8 
json_bench(c: &mut criterion::Criterion)9 fn json_bench(c: &mut criterion::Criterion) {
10     let data = [("small", SMALL), ("canada", CANADA)];
11     let mut group = c.benchmark_group("json");
12     for (name, sample) in data {
13         let len = sample.len();
14         group.throughput(criterion::Throughput::Bytes(len as u64));
15 
16         group.bench_with_input(criterion::BenchmarkId::new("basic", name), &len, |b, _| {
17             type Error<'i> = winnow::error::InputError<parser::Stream<'i>>;
18 
19             b.iter(|| parser::json::<Error>.parse_peek(sample).unwrap());
20         });
21         group.bench_with_input(criterion::BenchmarkId::new("unit", name), &len, |b, _| {
22             type Error<'i> = ();
23 
24             b.iter(|| parser::json::<Error>.parse_peek(sample).unwrap());
25         });
26         group.bench_with_input(
27             criterion::BenchmarkId::new("context", name),
28             &len,
29             |b, _| {
30                 type Error<'i> = winnow::error::ContextError<parser::Stream<'i>>;
31 
32                 b.iter(|| parser::json::<Error>.parse_peek(sample).unwrap());
33             },
34         );
35         group.bench_with_input(
36             criterion::BenchmarkId::new("dispatch", name),
37             &len,
38             |b, _| {
39                 type Error<'i> = winnow::error::InputError<parser_dispatch::Stream<'i>>;
40 
41                 b.iter(|| parser_dispatch::json::<Error>.parse_peek(sample).unwrap());
42             },
43         );
44         group.bench_with_input(
45             criterion::BenchmarkId::new("streaming", name),
46             &len,
47             |b, _| {
48                 type Error<'i> = winnow::error::InputError<parser_partial::Stream<'i>>;
49 
50                 b.iter(|| {
51                     parser_partial::json::<Error>
52                         .parse_peek(Partial::new(sample))
53                         .unwrap()
54                 });
55             },
56         );
57     }
58     group.finish();
59 }
60 
61 const SMALL: &str = "  { \"a\"\t: 42,
62   \"b\": [ \"x\", \"y\", 12 ,\"\\u2014\", \"\\uD83D\\uDE10\"] ,
63   \"c\": { \"hello\" : \"world\"
64   }
65   }  ";
66 
67 const CANADA: &str = include_str!("../../third_party/nativejson-benchmark/data/canada.json");
68 
69 criterion::criterion_group!(benches, json_bench,);
70 criterion::criterion_main!(benches);
71