16855e09eSopenharmony_ci#[global_allocator]
26855e09eSopenharmony_cistatic ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
36855e09eSopenharmony_ci
46855e09eSopenharmony_ciuse criterion::*;
56855e09eSopenharmony_ci
66855e09eSopenharmony_ciuse nom::{
76855e09eSopenharmony_ci  bytes::complete::take_while,
86855e09eSopenharmony_ci  character::complete::{
96855e09eSopenharmony_ci    alphanumeric1 as alphanumeric, char, multispace1 as multispace, space1 as space,
106855e09eSopenharmony_ci  },
116855e09eSopenharmony_ci  combinator::{map, map_res, opt},
126855e09eSopenharmony_ci  multi::many0,
136855e09eSopenharmony_ci  sequence::{delimited, pair, separated_pair, terminated, tuple},
146855e09eSopenharmony_ci  IResult,
156855e09eSopenharmony_ci};
166855e09eSopenharmony_ciuse std::collections::HashMap;
176855e09eSopenharmony_ciuse std::str;
186855e09eSopenharmony_ci
196855e09eSopenharmony_cifn category(i: &[u8]) -> IResult<&[u8], &str> {
206855e09eSopenharmony_ci  map_res(
216855e09eSopenharmony_ci    delimited(char('['), take_while(|c| c != b']'), char(']')),
226855e09eSopenharmony_ci    str::from_utf8,
236855e09eSopenharmony_ci  )(i)
246855e09eSopenharmony_ci}
256855e09eSopenharmony_ci
266855e09eSopenharmony_cifn key_value(i: &[u8]) -> IResult<&[u8], (&str, &str)> {
276855e09eSopenharmony_ci  let (i, key) = map_res(alphanumeric, str::from_utf8)(i)?;
286855e09eSopenharmony_ci  let (i, _) = tuple((opt(space), char('='), opt(space)))(i)?;
296855e09eSopenharmony_ci  let (i, val) = map_res(take_while(|c| c != b'\n' && c != b';'), str::from_utf8)(i)?;
306855e09eSopenharmony_ci  let (i, _) = opt(pair(char(';'), take_while(|c| c != b'\n')))(i)?;
316855e09eSopenharmony_ci  Ok((i, (key, val)))
326855e09eSopenharmony_ci}
336855e09eSopenharmony_ci
346855e09eSopenharmony_cifn categories(i: &[u8]) -> IResult<&[u8], HashMap<&str, HashMap<&str, &str>>> {
356855e09eSopenharmony_ci  map(
366855e09eSopenharmony_ci    many0(separated_pair(
376855e09eSopenharmony_ci      category,
386855e09eSopenharmony_ci      opt(multispace),
396855e09eSopenharmony_ci      map(
406855e09eSopenharmony_ci        many0(terminated(key_value, opt(multispace))),
416855e09eSopenharmony_ci        |vec: Vec<_>| vec.into_iter().collect(),
426855e09eSopenharmony_ci      ),
436855e09eSopenharmony_ci    )),
446855e09eSopenharmony_ci    |vec: Vec<_>| vec.into_iter().collect(),
456855e09eSopenharmony_ci  )(i)
466855e09eSopenharmony_ci}
476855e09eSopenharmony_ci
486855e09eSopenharmony_cifn bench_ini(c: &mut Criterion) {
496855e09eSopenharmony_ci  let str = "[owner]
506855e09eSopenharmony_ciname=John Doe
516855e09eSopenharmony_ciorganization=Acme Widgets Inc.
526855e09eSopenharmony_ci
536855e09eSopenharmony_ci[database]
546855e09eSopenharmony_ciserver=192.0.2.62
556855e09eSopenharmony_ciport=143
566855e09eSopenharmony_cifile=payroll.dat
576855e09eSopenharmony_ci\0";
586855e09eSopenharmony_ci
596855e09eSopenharmony_ci  let mut group = c.benchmark_group("ini");
606855e09eSopenharmony_ci  group.throughput(Throughput::Bytes(str.len() as u64));
616855e09eSopenharmony_ci  group.bench_function(BenchmarkId::new("parse", str.len()), |b| {
626855e09eSopenharmony_ci    b.iter(|| categories(str.as_bytes()).unwrap())
636855e09eSopenharmony_ci  });
646855e09eSopenharmony_ci}
656855e09eSopenharmony_ci
666855e09eSopenharmony_cifn bench_ini_keys_and_values(c: &mut Criterion) {
676855e09eSopenharmony_ci  let str = "server=192.0.2.62
686855e09eSopenharmony_ciport=143
696855e09eSopenharmony_cifile=payroll.dat
706855e09eSopenharmony_ci\0";
716855e09eSopenharmony_ci
726855e09eSopenharmony_ci  fn acc(i: &[u8]) -> IResult<&[u8], Vec<(&str, &str)>> {
736855e09eSopenharmony_ci    many0(key_value)(i)
746855e09eSopenharmony_ci  }
756855e09eSopenharmony_ci
766855e09eSopenharmony_ci  let mut group = c.benchmark_group("ini keys and values");
776855e09eSopenharmony_ci  group.throughput(Throughput::Bytes(str.len() as u64));
786855e09eSopenharmony_ci  group.bench_function(BenchmarkId::new("parse", str.len()), |b| {
796855e09eSopenharmony_ci    b.iter(|| acc(str.as_bytes()).unwrap())
806855e09eSopenharmony_ci  });
816855e09eSopenharmony_ci}
826855e09eSopenharmony_ci
836855e09eSopenharmony_cifn bench_ini_key_value(c: &mut Criterion) {
846855e09eSopenharmony_ci  let str = "server=192.0.2.62\n";
856855e09eSopenharmony_ci
866855e09eSopenharmony_ci  let mut group = c.benchmark_group("ini key value");
876855e09eSopenharmony_ci  group.throughput(Throughput::Bytes(str.len() as u64));
886855e09eSopenharmony_ci  group.bench_function(BenchmarkId::new("parse", str.len()), |b| {
896855e09eSopenharmony_ci    b.iter(|| key_value(str.as_bytes()).unwrap())
906855e09eSopenharmony_ci  });
916855e09eSopenharmony_ci}
926855e09eSopenharmony_ci
936855e09eSopenharmony_cicriterion_group!(
946855e09eSopenharmony_ci  benches,
956855e09eSopenharmony_ci  bench_ini,
966855e09eSopenharmony_ci  bench_ini_keys_and_values,
976855e09eSopenharmony_ci  bench_ini_key_value
986855e09eSopenharmony_ci);
996855e09eSopenharmony_cicriterion_main!(benches);
100