difftreelog
perf faster foldl, foldr
in: master
2 files changed
crates/jrsonnet-evaluator/build.rsdiffbeforeafterboth1use bincode::serialize;2use jrsonnet_parser::{3 parse, Expr, FieldMember, FieldName, LocExpr, Member, ObjBody, ParserSettings,4};5use jrsonnet_stdlib::STDLIB_STR;6use std::{7 env,8 fs::File,9 io::Write,10 path::{Path, PathBuf},11 rc::Rc,12};13use structdump::CodegenResult;1415fn main() {16 let parsed = parse(17 STDLIB_STR,18 &ParserSettings {19 file_name: Rc::new(PathBuf::from("std.jsonnet")),20 loc_data: true,21 },22 )23 .expect("parse");2425 let parsed = if cfg!(feature = "faster") {26 let LocExpr(expr, location) = parsed;27 LocExpr(28 Rc::new(match Rc::try_unwrap(expr).unwrap() {29 Expr::Obj(ObjBody::MemberList(members)) => Expr::Obj(ObjBody::MemberList(30 members31 .into_iter()32 .filter(|p| {33 !matches!(34 p,35 Member::Field(FieldMember {36 name: FieldName::Fixed(name),37 ..38 }) if **name == *"join" || **name == *"manifestJsonEx" || **name == *"escapeStringJson" || **name == *"equals" || **name == *"base64"39 )40 })41 .collect(),42 )),43 _ => panic!("std value should be object"),44 }),45 location,46 )47 } else {48 parsed49 };50 {51 let mut codegen = CodegenResult::default();52 let code = codegen.codegen(&parsed);5354 let out_dir = env::var("OUT_DIR").unwrap();55 let dest_path = Path::new(&out_dir).join("stdlib.rs");56 let mut f = File::create(&dest_path).unwrap();57 f.write_all(&code.as_bytes()).unwrap();58 }59 {60 let out_dir = env::var("OUT_DIR").unwrap();61 let dest_path = Path::new(&out_dir).join("stdlib.bincode");62 let mut f = File::create(&dest_path).unwrap();63 f.write_all(&serialize(&parsed).unwrap()).unwrap();64 }65}1use bincode::serialize;2use jrsonnet_parser::{3 parse, Expr, FieldMember, FieldName, LocExpr, Member, ObjBody, ParserSettings,4};5use jrsonnet_stdlib::STDLIB_STR;6use std::{7 env,8 fs::File,9 io::Write,10 path::{Path, PathBuf},11 rc::Rc,12};13use structdump::CodegenResult;1415fn main() {16 let parsed = parse(17 STDLIB_STR,18 &ParserSettings {19 file_name: Rc::new(PathBuf::from("std.jsonnet")),20 loc_data: true,21 },22 )23 .expect("parse");2425 let parsed = if cfg!(feature = "faster") {26 let LocExpr(expr, location) = parsed;27 LocExpr(28 Rc::new(match Rc::try_unwrap(expr).unwrap() {29 Expr::Obj(ObjBody::MemberList(members)) => Expr::Obj(ObjBody::MemberList(30 members31 .into_iter()32 .filter(|p| {33 !matches!(34 p,35 Member::Field(FieldMember {36 name: FieldName::Fixed(name),37 ..38 })39 if **name == *"join" || **name == *"manifestJsonEx" ||40 **name == *"escapeStringJson" || **name == *"equals" ||41 **name == *"base64" || **name == *"foldl" || **name == *"foldr"42 )43 })44 .collect(),45 )),46 _ => panic!("std value should be object"),47 }),48 location,49 )50 } else {51 parsed52 };53 {54 let mut codegen = CodegenResult::default();55 let code = codegen.codegen(&parsed);5657 let out_dir = env::var("OUT_DIR").unwrap();58 let dest_path = Path::new(&out_dir).join("stdlib.rs");59 let mut f = File::create(&dest_path).unwrap();60 f.write_all(&code.as_bytes()).unwrap();61 }62 {63 let out_dir = env::var("OUT_DIR").unwrap();64 let dest_path = Path::new(&out_dir).join("stdlib.bincode");65 let mut f = File::create(&dest_path).unwrap();66 f.write_all(&serialize(&parsed).unwrap()).unwrap();67 }68}crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -557,6 +557,30 @@
.collect(),
)))
}))?,
+ // faster
+ ("std", "foldl") => noinline!(parse_args!(context, "std.foldl", args, 3, [
+ 0, func: [Val::Func]!!Val::Func, vec![ValType::Func];
+ 1, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];
+ 2, init, vec![];
+ ], {
+ let mut acc = init;
+ for i in arr.iter().cloned() {
+ acc = func.evaluate_values(context.clone(), &[acc, i])?;
+ }
+ Ok(acc)
+ }))?,
+ // faster
+ ("std", "foldr") => noinline!(parse_args!(context, "std.foldr", args, 3, [
+ 0, func: [Val::Func]!!Val::Func, vec![ValType::Func];
+ 1, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];
+ 2, init, vec![];
+ ], {
+ let mut acc = init;
+ for i in arr.iter().rev().cloned() {
+ acc = func.evaluate_values(context.clone(), &[acc, i])?;
+ }
+ Ok(acc)
+ }))?,
("std", "char") => parse_args!(context, "std.char", args, 1, [
0, n: [Val::Num]!!Val::Num, vec![ValType::Num];
], {