perf: Evaluator, parser, sort, and strip optimizations (batch 4)#703
perf: Evaluator, parser, sort, and strip optimizations (batch 4)#703He-Pin wants to merge 1 commit intodatabricks:masterfrom
Conversation
Upstream jit branch commits: databricks#49 (parser single-pass), databricks#52 (tailstrict while-loops), databricks#56 (array compare fix), databricks#64 (ConstMember fast path), databricks#78 (ASCII bitset strip), databricks#86 (primitive double sort) Evaluator: - visitArr: .map(visitAsLazy) -> while-loop with pre-sized Array[Eval] - visitImportBin: .map(...) -> while-loop - visitObjComp: for-comprehension -> indexed while-loop - visitComp IfSpec: scopes.filter -> ArrayBuilder while-loop - compare: Eval-level reference equality skip + numeric fast path - equal: Eval-level reference equality + Val identity check - visitMemberList: ConstMember fast path for Val literals and resolved ValidId bindings Val: - Tailstrict: foreach(_.value) -> while-loops (simple + complex paths) SetModule: - Keyed numeric sort: extract doubles for unboxed comparison - No-key numeric sort: Arrays.sort(doubles) + reconstruct (DualPivot) Parser: - Single-pass member classification: 3x iterator.filter -> 1 while-loop with ArrayBuilders for binds, fields, and asserts - Comprehension preLocals/postLocals: takeWhile+map+drop -> index-based StringModule: - ASCII bitset strip: 128-bit bitset (2 Longs) for ASCII char sets, charAt + bitset lookup instead of codePointAt + Set[Int].contains
Code ReviewI found several correctness issues in this PR: 1.
|
Motivation
Multiple independent micro-optimizations in the evaluator, parser, sort, and strip operations that together provide measurable improvement across benchmarks.
Key Design Decision
Batch together several complementary optimizations:
Modification
Benchmark Results
JMH (JVM, 3 iterations)
Analysis
References
he-pin/sjsonnetjit branch, multiple evaluator optimization commitsResult
Broad -9% to -18% JVM improvement across all key benchmarks via batched micro-optimizations.