difftreelog
perf destruct capacity hints
in: master
2 files changed
crates/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) = ¶m.1 {
crates/jrsonnet-parser/src/expr.rsdiffbeforeafterboth228 _ => 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 name257 None => out += 1,258 }259 }260 out + cap_rest(rest)261 }262 }263 }231}264}232265233#[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}247288248#[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))]