git.delta.rocks / jrsonnet / refs/commits / 226d3aa6c541

difftreelog

perf faster sort

Лач2020-07-19parent: #34b1225.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-evaluator/build.rsdiffbeforeafterboth
38 })38 })
39 if **name == *"join" || **name == *"manifestJsonEx" ||39 if **name == *"join" || **name == *"manifestJsonEx" ||
40 **name == *"escapeStringJson" || **name == *"equals" ||40 **name == *"escapeStringJson" || **name == *"equals" ||
41 **name == *"base64" || **name == *"foldl" || **name == *"foldr"41 **name == *"base64" || **name == *"foldl" || **name == *"foldr" ||
42 **name == *"sortImpl"
42 )43 )
43 })44 })
44 .collect(),45 .collect(),
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
10 ForSpecData, IfSpecData, LiteralType, LocExpr, Member, ObjBody, ParamsDesc, UnaryOpType,10 ForSpecData, IfSpecData, LiteralType, LocExpr, Member, ObjBody, ParamsDesc, UnaryOpType,
11 Visibility,11 Visibility,
12};12};
13use std::{collections::HashMap, rc::Rc};13use std::{cmp::Ordering, collections::HashMap, rc::Rc};
1414
15pub fn evaluate_binding(b: &BindSpec, context_creator: ContextCreator) -> (Rc<str>, LazyBinding) {15pub fn evaluate_binding(b: &BindSpec, context_creator: ContextCreator) -> (Rc<str>, LazyBinding) {
16 let b = b.clone();16 let b = b.clone();
581 }581 }
582 Ok(acc)582 Ok(acc)
583 }))?,583 }))?,
584 // faster
585 ("std", "sortImpl") => noinline!(parse_args!(context, "std.sort", args, 2, [
586 0, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];
587 1, keyF: [Val::Func]!!Val::Func, vec![ValType::Func];
588 ], {
589 if arr.len() <= 1 {
590 return Ok(Val::Arr(arr))
591 }
592 let mut new_arr = arr.iter().cloned().collect::<Vec<_>>();
593 match keyF.evaluate_values(context.clone(), &[new_arr[0].clone()])? {
594 Val::Str(_) => {
595 let mut err = None;
596 new_arr.sort_by_cached_key(|k| {
597 match keyF.evaluate_values(context.clone(), &[k.clone()]) {
598 Ok(Val::Str(v)) => v,
599 Ok(_) => {
600 err = Some(create_error(crate::error::Error::RuntimeError("types of all array elements should equal".into())));
601 "".into()
602 }
603 Err(e) => {
604 err = Some(e);
605 "".into()
606 }
607 }
608 });
609 if let Some(e) = err {
610 return Err(e);
611 }
612 },
613 Val::Num(_) => {
614 let mut err = None;
615 new_arr.sort_unstable_by(|a, b| {
616 match (keyF.evaluate_values(context.clone(), &[a.clone()]), keyF.evaluate_values(context.clone(), &[b.clone()])) {
617 (Ok(Val::Num(a)), Ok(Val::Num(b))) => a.partial_cmp(&b).unwrap(),
618 (Ok(_a), Ok(_b)) => {
619 err = Some(create_error(crate::error::Error::RuntimeError("types of all array elements should equal".into())));
620 Ordering::Equal
621 }
622 (Err(e), _) | (_, Err(e)) => {
623 err = Some(e);
624 Ordering::Equal
625 }
626 }
627 });
628 if let Some(e) = err {
629 return Err(e);
630 }
631 },
632 _ => return Err(create_error(crate::error::Error::RuntimeError("keys should be number or string".into())))
633 }
634 Ok(Val::Arr(Rc::new(new_arr)))
635 }))?,
584 ("std", "char") => parse_args!(context, "std.char", args, 1, [636 ("std", "char") => parse_args!(context, "std.char", args, 1, [
585 0, n: [Val::Num]!!Val::Num, vec![ValType::Num];637 0, n: [Val::Num]!!Val::Num, vec![ValType::Num];
586 ], {638 ], {
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
1131 std.makeArray(l, function(i) arr[l - i - 1]),1131 std.makeArray(l, function(i) arr[l - i - 1]),
11321132
1133 // Merge-sort for long arrays and naive quicksort for shorter ones1133 // Merge-sort for long arrays and naive quicksort for shorter ones
1134 sort(arr, keyF=id)::1134 sortImpl(arr, keyF)::
1135 local quickSort(arr, keyF=id) =1135 local quickSort(arr, keyF=id) =
1136 local l = std.length(arr);1136 local l = std.length(arr);
1137 if std.length(arr) <= 1 then1137 if std.length(arr) <= 1 then
1165 local mid = std.floor(l / 2);1165 local mid = std.floor(l / 2);
1166 local left = arr[:mid], right = arr[mid:];1166 local left = arr[:mid], right = arr[mid:];
1167 merge(std.sort(left, keyF=keyF), std.sort(right, keyF=keyF)),1167 merge(std.sort(left, keyF=keyF), std.sort(right, keyF=keyF)),
1168
1169 sort(arr, keyF=id)::
1170 std.sortImpl(arr, keyF),
11681171
1169 uniq(arr, keyF=id)::1172 uniq(arr, keyF=id)::
1170 local f(a, b) =1173 local f(a, b) =