From 625fbae2cdcf8f0c29a28dbbf29810ee0b8262d1 Mon Sep 17 00:00:00 2001 From: Лач Date: Wed, 01 Jul 2020 16:26:40 +0000 Subject: [PATCH] perf(evaluator): use hashmap for object body --- --- a/bindings/jsonnet/src/lib.rs +++ b/bindings/jsonnet/src/lib.rs @@ -8,7 +8,7 @@ alloc::Layout, any::Any, cell::RefCell, - collections::BTreeMap, + collections::HashMap, ffi::{CStr, CString}, fs::File, io::Read, @@ -191,7 +191,7 @@ ) { match obj { Val::Obj(old) => { - let mut new = BTreeMap::new(); + let mut new = HashMap::new(); new.insert( CStr::from_ptr(name).to_str().unwrap().into(), ObjMember { --- a/crates/jrsonnet-evaluator/src/evaluate.rs +++ b/crates/jrsonnet-evaluator/src/evaluate.rs @@ -9,10 +9,7 @@ ForSpecData, IfSpecData, LiteralType, LocExpr, Member, ObjBody, ParamsDesc, UnaryOpType, Visibility, }; -use std::{ - collections::{BTreeMap, HashMap}, - rc::Rc, -}; +use std::{collections::HashMap, rc::Rc}; pub fn evaluate_binding(b: &BindSpec, context_creator: ContextCreator) -> (Rc, LazyBinding) { let b = b.clone(); @@ -242,7 +239,7 @@ new_bindings.fill(bindings); } - let mut new_members = BTreeMap::new(); + let mut new_members = HashMap::new(); for member in members.iter() { match member { Member::Field(FieldMember { @@ -317,7 +314,7 @@ ObjBody::MemberList(members) => evaluate_member_list_object(context, &members)?, ObjBody::ObjComp(obj) => { let future_this = FutureObjValue::new(); - let mut new_members = BTreeMap::new(); + let mut new_members = HashMap::new(); for (k, v) in evaluate_comp( context.clone(), &|ctx| { @@ -450,13 +447,13 @@ 0, obj: [Val::Obj]!!Val::Obj, vec![ValType::Obj]; 1, inc_hidden: [Val::Bool]!!Val::Bool, vec![ValType::Bool]; ], { - Ok(Val::Arr(Rc::new( - obj.fields_visibility() - .into_iter() - .filter(|(_k, v)| *v || inc_hidden) - .map(|(k, _v)| Val::Str(k)) - .collect(), - ))) + let mut out = obj.fields_visibility() + .into_iter() + .filter(|(_k, v)| *v || inc_hidden) + .map(|(k, _v)|k) + .collect::>(); + out.sort(); + Ok(Val::Arr(Rc::new(out.into_iter().map(Val::Str).collect()))) }))? } // object, field, includeHidden --- a/crates/jrsonnet-evaluator/src/obj.rs +++ b/crates/jrsonnet-evaluator/src/obj.rs @@ -1,12 +1,7 @@ use crate::{evaluate_add_op, LazyBinding, Result, Val}; use indexmap::IndexMap; -use jrsonnet_parser::Visibility; -use std::{ - cell::RefCell, - collections::{BTreeMap, HashMap}, - fmt::Debug, - rc::Rc, -}; +use jrsonnet_parser::{ExprLocation, Visibility}; +use std::{cell::RefCell, collections::HashMap, fmt::Debug, rc::Rc}; #[derive(Debug)] pub struct ObjMember { @@ -18,7 +13,7 @@ #[derive(Debug)] pub struct ObjValueInternals { super_obj: Option, - this_entries: Rc, ObjMember>>, + this_entries: Rc, ObjMember>>, value_cache: RefCell, Val>>, } #[derive(Clone)] @@ -44,7 +39,7 @@ impl ObjValue { pub fn new( super_obj: Option, - this_entries: Rc, ObjMember>>, + this_entries: Rc, ObjMember>>, ) -> ObjValue { ObjValue(Rc::new(ObjValueInternals { super_obj, @@ -53,7 +48,7 @@ })) } pub fn new_empty() -> ObjValue { - Self::new(None, Rc::new(BTreeMap::new())) + Self::new(None, Rc::new(HashMap::new())) } pub fn with_super(&self, super_obj: ObjValue) -> ObjValue { match &self.0.super_obj { --- a/crates/jrsonnet-evaluator/src/val.rs +++ b/crates/jrsonnet-evaluator/src/val.rs @@ -246,7 +246,8 @@ } Val::Obj(obj) => { buf.push_str("{\n"); - let fields = obj.visible_fields(); + let mut fields = obj.visible_fields(); + fields.sort(); if !fields.is_empty() { let old_len = cur_padding.len(); cur_padding.push_str(padding); -- gitstuff