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