1 mod parser; 2 mod parser_ast; 3 mod parser_lexer; 4 5 use winnow::prelude::*; 6 7 #[allow(clippy::eq_op, clippy::erasing_op)] arithmetic(c: &mut criterion::Criterion)8fn arithmetic(c: &mut criterion::Criterion) { 9 let data = " 2*2 / ( 5 - 1) + 3 / 4 * (2 - 7 + 567 *12 /2) + 3*(1+2*( 45 /2))"; 10 let expected = 2 * 2 / (5 - 1) + 3 * (1 + 2 * (45 / 2)); 11 12 assert_eq!(parser::expr.parse(data), Ok(expected)); 13 assert_eq!( 14 parser_ast::expr.parse(data).map(|ast| ast.eval()), 15 Ok(expected) 16 ); 17 assert_eq!( 18 parser_lexer::expr2.parse(data).map(|ast| ast.eval()), 19 Ok(expected) 20 ); 21 c.bench_function("direct", |b| { 22 b.iter(|| parser::expr.parse(data).unwrap()); 23 }); 24 c.bench_function("ast", |b| { 25 b.iter(|| parser_ast::expr.parse(data).unwrap().eval()); 26 }); 27 c.bench_function("lexer", |b| { 28 b.iter(|| parser_lexer::expr2.parse_peek(data).unwrap()); 29 }); 30 } 31 32 criterion::criterion_group!(benches, arithmetic); 33 criterion::criterion_main!(benches); 34