use winnow::combinator::repeat; use winnow::prelude::*; mod parser; mod parser_str; fn bench_ini(c: &mut criterion::Criterion) { let str = "[owner] name=John Doe organization=Acme Widgets Inc. [database] server=192.0.2.62 port=143 file=payroll.dat \0"; let mut group = c.benchmark_group("ini"); group.throughput(criterion::Throughput::Bytes(str.len() as u64)); group.bench_function(criterion::BenchmarkId::new("bytes", str.len()), |b| { b.iter(|| parser::categories.parse_peek(str.as_bytes()).unwrap()); }); group.bench_function(criterion::BenchmarkId::new("str", str.len()), |b| { b.iter(|| parser_str::categories.parse_peek(str).unwrap()) }); } fn bench_ini_keys_and_values(c: &mut criterion::Criterion) { let str = "server=192.0.2.62 port=143 file=payroll.dat \0"; fn acc<'s>(i: &mut parser::Stream<'s>) -> PResult> { repeat(0.., parser::key_value).parse_next(i) } let mut group = c.benchmark_group("ini keys and values"); group.throughput(criterion::Throughput::Bytes(str.len() as u64)); group.bench_function(criterion::BenchmarkId::new("bytes", str.len()), |b| { b.iter(|| acc.parse_peek(str.as_bytes()).unwrap()); }); } fn bench_ini_key_value(c: &mut criterion::Criterion) { let str = "server=192.0.2.62\n"; let mut group = c.benchmark_group("ini key value"); group.throughput(criterion::Throughput::Bytes(str.len() as u64)); group.bench_function(criterion::BenchmarkId::new("bytes", str.len()), |b| { b.iter(|| parser::key_value.parse_peek(str.as_bytes()).unwrap()); }); } criterion::criterion_group!( benches, bench_ini, bench_ini_keys_and_values, bench_ini_key_value ); criterion::criterion_main!(benches);