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::{is_a, tag, take_till, take_while}, 86855e09eSopenharmony_ci character::complete::{alphanumeric1 as alphanumeric, char, not_line_ending, space0 as space}, 96855e09eSopenharmony_ci combinator::opt, 106855e09eSopenharmony_ci multi::many0, 116855e09eSopenharmony_ci sequence::{delimited, pair, terminated, tuple}, 126855e09eSopenharmony_ci IResult, 136855e09eSopenharmony_ci}; 146855e09eSopenharmony_ci 156855e09eSopenharmony_ciuse std::collections::HashMap; 166855e09eSopenharmony_ci 176855e09eSopenharmony_cifn is_line_ending_or_comment(chr: char) -> bool { 186855e09eSopenharmony_ci chr == ';' || chr == '\n' 196855e09eSopenharmony_ci} 206855e09eSopenharmony_ci 216855e09eSopenharmony_cifn space_or_line_ending(i: &str) -> IResult<&str, &str> { 226855e09eSopenharmony_ci is_a(" \r\n")(i) 236855e09eSopenharmony_ci} 246855e09eSopenharmony_ci 256855e09eSopenharmony_cifn category(i: &str) -> IResult<&str, &str> { 266855e09eSopenharmony_ci terminated( 276855e09eSopenharmony_ci delimited(char('['), take_while(|c| c != ']'), char(']')), 286855e09eSopenharmony_ci opt(is_a(" \r\n")), 296855e09eSopenharmony_ci )(i) 306855e09eSopenharmony_ci} 316855e09eSopenharmony_ci 326855e09eSopenharmony_cifn key_value(i: &str) -> IResult<&str, (&str, &str)> { 336855e09eSopenharmony_ci let (i, key) = alphanumeric(i)?; 346855e09eSopenharmony_ci let (i, _) = tuple((opt(space), tag("="), opt(space)))(i)?; 356855e09eSopenharmony_ci let (i, val) = take_till(is_line_ending_or_comment)(i)?; 366855e09eSopenharmony_ci let (i, _) = opt(space)(i)?; 376855e09eSopenharmony_ci let (i, _) = opt(pair(tag(";"), not_line_ending))(i)?; 386855e09eSopenharmony_ci let (i, _) = opt(space_or_line_ending)(i)?; 396855e09eSopenharmony_ci Ok((i, (key, val))) 406855e09eSopenharmony_ci} 416855e09eSopenharmony_ci 426855e09eSopenharmony_cifn keys_and_values_aggregator(i: &str) -> IResult<&str, Vec<(&str, &str)>> { 436855e09eSopenharmony_ci many0(key_value)(i) 446855e09eSopenharmony_ci} 456855e09eSopenharmony_ci 466855e09eSopenharmony_cifn keys_and_values(input: &str) -> IResult<&str, HashMap<&str, &str>> { 476855e09eSopenharmony_ci match keys_and_values_aggregator(input) { 486855e09eSopenharmony_ci Ok((i, tuple_vec)) => Ok((i, tuple_vec.into_iter().collect())), 496855e09eSopenharmony_ci Err(e) => Err(e), 506855e09eSopenharmony_ci } 516855e09eSopenharmony_ci} 526855e09eSopenharmony_ci 536855e09eSopenharmony_cifn category_and_keys(i: &str) -> IResult<&str, (&str, HashMap<&str, &str>)> { 546855e09eSopenharmony_ci pair(category, keys_and_values)(i) 556855e09eSopenharmony_ci} 566855e09eSopenharmony_ci 576855e09eSopenharmony_cifn categories_aggregator(i: &str) -> IResult<&str, Vec<(&str, HashMap<&str, &str>)>> { 586855e09eSopenharmony_ci many0(category_and_keys)(i) 596855e09eSopenharmony_ci} 606855e09eSopenharmony_ci 616855e09eSopenharmony_cifn categories(input: &str) -> IResult<&str, HashMap<&str, HashMap<&str, &str>>> { 626855e09eSopenharmony_ci match categories_aggregator(input) { 636855e09eSopenharmony_ci Ok((i, tuple_vec)) => Ok((i, tuple_vec.into_iter().collect())), 646855e09eSopenharmony_ci Err(e) => Err(e), 656855e09eSopenharmony_ci } 666855e09eSopenharmony_ci} 676855e09eSopenharmony_ci 686855e09eSopenharmony_cifn bench_ini_str(c: &mut Criterion) { 696855e09eSopenharmony_ci let s = "[owner] 706855e09eSopenharmony_ciname=John Doe 716855e09eSopenharmony_ciorganization=Acme Widgets Inc. 726855e09eSopenharmony_ci 736855e09eSopenharmony_ci[database] 746855e09eSopenharmony_ciserver=192.0.2.62 756855e09eSopenharmony_ciport=143 766855e09eSopenharmony_cifile=payroll.dat 776855e09eSopenharmony_ci"; 786855e09eSopenharmony_ci 796855e09eSopenharmony_ci let mut group = c.benchmark_group("ini str"); 806855e09eSopenharmony_ci group.throughput(Throughput::Bytes(s.len() as u64)); 816855e09eSopenharmony_ci group.bench_function(BenchmarkId::new("parse", s.len()), |b| { 826855e09eSopenharmony_ci b.iter(|| categories(s).unwrap()) 836855e09eSopenharmony_ci }); 846855e09eSopenharmony_ci} 856855e09eSopenharmony_ci 866855e09eSopenharmony_cicriterion_group!(benches, bench_ini_str); 876855e09eSopenharmony_cicriterion_main!(benches); 88