From 23ef1b1df0fb4257fcc74e24267a5ca4e1578ba5 Mon Sep 17 00:00:00 2001 From: He-Pin Date: Sat, 4 Apr 2026 23:27:42 +0800 Subject: [PATCH] perf: in-place Arrays.sort for numeric/string/array sorting Replace map+sortBy chain with java.util.Arrays.sort for numeric, string, and array sorting in the identity-key path. This eliminates intermediate array allocations from the Schwartzian transform in Scala's sortBy and sorts the strict array in-place. Upstream: jit branch commit 926a6d0f --- sjsonnet/src/sjsonnet/stdlib/SetModule.scala | 25 +++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala index fc6558d5..e8066622 100644 --- a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala @@ -125,17 +125,36 @@ object SetModule extends AbstractFunctionModule { if (!strict.forall(_.getClass == keyType)) Error.fail("Cannot sort with values that are not all the same type") + // Sort in-place to avoid intermediate array allocations from map+sortBy if (keyType == classOf[Val.Str]) { - strict.map(_.cast[Val.Str]).sortBy(_.asString)(Util.CodepointStringOrdering) + java.util.Arrays.sort( + strict.asInstanceOf[Array[AnyRef]], + (a: AnyRef, b: AnyRef) => + Util.compareStringsByCodepoint( + a.asInstanceOf[Val.Str].asString, + b.asInstanceOf[Val.Str].asString + ) + ) } else if (keyType == classOf[Val.Num]) { - strict.map(_.cast[Val.Num]).sortBy(_.asDouble) + java.util.Arrays.sort( + strict.asInstanceOf[Array[AnyRef]], + (a: AnyRef, b: AnyRef) => + java.lang.Double.compare( + a.asInstanceOf[Val.Num].asDouble, + b.asInstanceOf[Val.Num].asDouble + ) + ) } else if (keyType == classOf[Val.Arr]) { - strict.map(_.cast[Val.Arr]).sortBy(identity)(ev.compare(_, _)) + java.util.Arrays.sort( + strict.asInstanceOf[Array[AnyRef]], + (a: AnyRef, b: AnyRef) => ev.compare(a.asInstanceOf[Val.Arr], b.asInstanceOf[Val.Arr]) + ) } else if (keyType == classOf[Val.Obj]) { Error.fail("Unable to sort array of objects without key function") } else { Error.fail("Cannot sort array of " + strict(0).prettyName) } + strict } ) }