git.delta.rocks / jrsonnet / refs/commits / 87a7e44fcfaf

difftreelog

perf destruct capacity hints

Yaroslav Bolyukin2022-11-09parent: #06bf1b3.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/function/parse.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/function/parse.rs
+++ b/crates/jrsonnet-evaluator/src/function/parse.rs
@@ -44,7 +44,8 @@
 	args: &dyn ArgsLike,
 	tailstrict: bool,
 ) -> Result<Context> {
-	let mut passed_args = GcHashMap::with_capacity(params.len());
+	let mut passed_args =
+		GcHashMap::with_capacity(params.iter().map(|p| p.0.capacity_hint()).sum());
 	if args.unnamed_len() > params.len() {
 		throw!(TooManyArgsFunctionHas(
 			params.len(),
@@ -83,8 +84,10 @@
 		// Some args are unset, but maybe we have defaults for them
 		// Default values should be created in newly created context
 		let fctx = Context::new_future();
-		let mut defaults =
-			GcHashMap::with_capacity(params.len() - filled_named - filled_positionals);
+		let mut defaults = GcHashMap::with_capacity(
+			params.iter().map(|p| p.0.capacity_hint()).sum::<usize>()
+				- filled_named - filled_positionals,
+		);
 
 		for (idx, param) in params.iter().enumerate().filter(|p| p.1 .1.is_some()) {
 			if let Some(name) = param.0.name() {
@@ -241,7 +244,7 @@
 
 	let fctx = Context::new_future();
 
-	let mut bindings = GcHashMap::new();
+	let mut bindings = GcHashMap::with_capacity(params.iter().map(|p| p.0.capacity_hint()).sum());
 
 	for param in params.iter() {
 		if let Some(v) = &param.1 {
modifiedcrates/jrsonnet-parser/src/expr.rsdiffbeforeafterboth
228 _ => None,228 _ => None,
229 }229 }
230 }230 }
231 pub fn capacity_hint(&self) -> usize {
232 #[cfg(feature = "exp-destruct")]
233 fn cap_rest(rest: &Option<DestructRest>) -> usize {
234 match rest {
235 Some(DestructRest::Keep(_)) => 1,
236 Some(DestructRest::Drop) => 0,
237 None => 0,
238 }
239 }
240 match self {
241 Self::Full(_) => 1,
242 #[cfg(feature = "exp-destruct")]
243 Self::Skip => 0,
244 #[cfg(feature = "exp-destruct")]
245 Self::Array { start, rest, end } => {
246 start.iter().map(Destruct::capacity_hint).sum::<usize>()
247 + end.iter().map(Destruct::capacity_hint).sum::<usize>()
248 + cap_rest(rest)
249 }
250 #[cfg(feature = "exp-destruct")]
251 Self::Object { fields, rest } => {
252 let mut out = 0;
253 for (_, into, _) in fields {
254 match into {
255 Some(v) => out += v.capacity_hint(),
256 // Field is destructured to default name
257 None => out += 1,
258 }
259 }
260 out + cap_rest(rest)
261 }
262 }
263 }
231}264}
232265
233#[cfg_attr(feature = "structdump", derive(Codegen))]266#[cfg_attr(feature = "structdump", derive(Codegen))]
244 value: LocExpr,277 value: LocExpr,
245 },278 },
246}279}
280impl BindSpec {
281 pub fn capacity_hint(&self) -> usize {
282 match self {
283 BindSpec::Field { into, .. } => into.capacity_hint(),
284 BindSpec::Function { .. } => 1,
285 }
286 }
287}
247288
248#[cfg_attr(feature = "structdump", derive(Codegen))]289#[cfg_attr(feature = "structdump", derive(Codegen))]
249#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]290#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]