tdsl-parser 1.18.0

PEG parser for the Timeline DSL (.tdsl) format
Documentation
use criterion::{Criterion, criterion_group, criterion_main};
use std::hint::black_box;

fn generate_tdsl(n: usize) -> String {
    let mut s = String::new();
    s.push_str(
        r#"timeline "Bench Timeline" {
    title "Bench Timeline";
    unit year;
    range 0..10000;
    calendar proleptic_gregorian;
}
lane "BenchLane" as bench { kind custom; order 1; }
"#,
    );
    for i in 0..n {
        let start = i as i64 * 10;
        let end = start + 9;
        s.push_str(&format!(
            "span bench {}..{} \"Item {}\" {{ tags [\"t\"]; }};\n",
            start, end, i
        ));
    }
    s
}

fn bench_parse_small(c: &mut Criterion) {
    let input = generate_tdsl(10);
    c.bench_function("parse_10_spans", |b| {
        b.iter(|| tdsl_parser::parse(black_box(&input)))
    });
}

fn bench_parse_medium(c: &mut Criterion) {
    let input = generate_tdsl(100);
    c.bench_function("parse_100_spans", |b| {
        b.iter(|| tdsl_parser::parse(black_box(&input)))
    });
}

fn bench_parse_large(c: &mut Criterion) {
    let input = generate_tdsl(1000);
    c.bench_function("parse_1000_spans", |b| {
        b.iter(|| tdsl_parser::parse(black_box(&input)))
    });
}

criterion_group!(
    benches,
    bench_parse_small,
    bench_parse_medium,
    bench_parse_large
);
criterion_main!(benches);