difftreelog
perf faster sort
in: master
3 files changed
crates/jrsonnet-evaluator/build.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/build.rs
+++ b/crates/jrsonnet-evaluator/build.rs
@@ -38,7 +38,8 @@
})
if **name == *"join" || **name == *"manifestJsonEx" ||
**name == *"escapeStringJson" || **name == *"equals" ||
- **name == *"base64" || **name == *"foldl" || **name == *"foldr"
+ **name == *"base64" || **name == *"foldl" || **name == *"foldr" ||
+ **name == *"sortImpl"
)
})
.collect(),
crates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth10 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};141415pub 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 // faster585 ("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::Equal621 }622 (Err(e), _) | (_, Err(e)) => {623 err = Some(e);624 Ordering::Equal625 }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 ], {crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -1131,7 +1131,7 @@
std.makeArray(l, function(i) arr[l - i - 1]),
// Merge-sort for long arrays and naive quicksort for shorter ones
- sort(arr, keyF=id)::
+ sortImpl(arr, keyF)::
local quickSort(arr, keyF=id) =
local l = std.length(arr);
if std.length(arr) <= 1 then
@@ -1166,6 +1166,9 @@
local left = arr[:mid], right = arr[mid:];
merge(std.sort(left, keyF=keyF), std.sort(right, keyF=keyF)),
+ sort(arr, keyF=id)::
+ std.sortImpl(arr, keyF),
+
uniq(arr, keyF=id)::
local f(a, b) =
if std.length(a) == 0 then