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