Skip to content

Commit 415524b

Browse files
authored
chore: Use more while loop (#627)
Motivation: Use more while loops and avoid some allocation. master: ``` 125] Benchmark (path) Mode Cnt Score Error Units 125] RegressionBenchmark.main bench/resources/bug_suite/assertions.jsonnet avgt 0.326 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.01.jsonnet avgt 0.073 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.02.jsonnet avgt 40.602 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.03.jsonnet avgt 13.352 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.04.jsonnet avgt 32.769 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.06.jsonnet avgt 0.448 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.07.jsonnet avgt 3.253 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.08.jsonnet avgt 0.062 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.09.jsonnet avgt 0.068 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/gen_big_object.jsonnet avgt 1.012 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/large_string_join.jsonnet avgt 2.059 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/large_string_template.jsonnet avgt 2.439 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/realistic1.jsonnet avgt 3.298 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/realistic2.jsonnet avgt 125.995 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64.jsonnet avgt 0.843 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64Decode.jsonnet avgt 0.651 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64DecodeBytes.jsonnet avgt 9.457 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64_byte_array.jsonnet avgt 1.515 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/comparison.jsonnet avgt 23.599 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/comparison2.jsonnet avgt 75.864 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/escapeStringJson.jsonnet avgt 0.050 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/foldl.jsonnet avgt 9.695 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/lstripChars.jsonnet avgt 0.650 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/manifestJsonEx.jsonnet avgt 0.072 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/manifestTomlEx.jsonnet avgt 0.089 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/manifestYamlDoc.jsonnet avgt 0.076 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/member.jsonnet avgt 0.731 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/parseInt.jsonnet avgt 0.052 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/reverse.jsonnet avgt 11.621 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/rstripChars.jsonnet avgt 0.647 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/stripChars.jsonnet avgt 0.632 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/substr.jsonnet avgt 0.173 ms/op 125] RegressionBenchmark.main bench/resources/sjsonnet_suite/setDiff.jsonnet avgt 0.493 ms/op 125] RegressionBenchmark.main bench/resources/sjsonnet_suite/setInter.jsonnet avgt 0.443 ms/op 125] RegressionBenchmark.main bench/resources/sjsonnet_suite/setUnion.jsonnet avgt 0.792 ms/op 125/125, SUCCESS] ./mill bench.runRegressions 438s ``` current: ``` 125] Benchmark (path) Mode Cnt Score Error Units 125] RegressionBenchmark.main bench/resources/bug_suite/assertions.jsonnet avgt 0.328 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.01.jsonnet avgt 0.103 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.02.jsonnet avgt 42.077 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.03.jsonnet avgt 13.699 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.04.jsonnet avgt 33.063 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.06.jsonnet avgt 0.411 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.07.jsonnet avgt 3.003 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.08.jsonnet avgt 0.059 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/bench.09.jsonnet avgt 0.066 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/gen_big_object.jsonnet avgt 0.973 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/large_string_join.jsonnet avgt 1.987 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/large_string_template.jsonnet avgt 2.367 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/realistic1.jsonnet avgt 3.579 ms/op 125] RegressionBenchmark.main bench/resources/cpp_suite/realistic2.jsonnet avgt 88.964 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64.jsonnet avgt 0.839 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64Decode.jsonnet avgt 0.641 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64DecodeBytes.jsonnet avgt 9.608 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/base64_byte_array.jsonnet avgt 1.477 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/comparison.jsonnet avgt 24.221 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/comparison2.jsonnet avgt 80.209 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/escapeStringJson.jsonnet avgt 0.050 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/foldl.jsonnet avgt 9.614 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/lstripChars.jsonnet avgt 0.628 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/manifestJsonEx.jsonnet avgt 0.072 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/manifestTomlEx.jsonnet avgt 0.093 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/manifestYamlDoc.jsonnet avgt 0.077 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/member.jsonnet avgt 0.750 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/parseInt.jsonnet avgt 0.054 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/reverse.jsonnet avgt 11.649 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/rstripChars.jsonnet avgt 0.647 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/stripChars.jsonnet avgt 0.643 ms/op 125] RegressionBenchmark.main bench/resources/go_suite/substr.jsonnet avgt 0.170 ms/op 125] RegressionBenchmark.main bench/resources/sjsonnet_suite/setDiff.jsonnet avgt 0.494 ms/op 125] RegressionBenchmark.main bench/resources/sjsonnet_suite/setInter.jsonnet avgt 0.443 ms/op 125] RegressionBenchmark.main bench/resources/sjsonnet_suite/setUnion.jsonnet avgt 0.778 ms/op 125/125, SUCCESS] ./mill bench.runRegressions 438s ```
1 parent 8747841 commit 415524b

2 files changed

Lines changed: 14 additions & 5 deletions

File tree

sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,11 @@ object ArrayModule extends AbstractFunctionModule {
233233
lazyArray.foreach(q.add)
234234
while (!q.isEmpty) {
235235
q.removeFirst().value match {
236-
case v: Val.Arr => v.asLazyArray.reverseIterator.foreach(q.push)
237-
case x => out += x
236+
case v: Val.Arr =>
237+
val inner = v.asLazyArray
238+
var i = inner.length - 1
239+
while (i >= 0) { q.push(inner(i)); i -= 1 }
240+
case x => out += x
238241
}
239242
}
240243
Val.Arr(pos, out.result())
@@ -317,9 +320,12 @@ object ArrayModule extends AbstractFunctionModule {
317320
arr.value match {
318321
case arr: Val.Arr =>
319322
var current = init.value
320-
for (item <- arr.asLazyArray.reverse) {
323+
val lazyArr = arr.asLazyArray
324+
var i = lazyArr.length - 1
325+
while (i >= 0) {
321326
val c = current
322-
current = func.apply2(item, c, pos.noOffset)(ev, TailstrictModeDisabled)
327+
current = func.apply2(lazyArr(i), c, pos.noOffset)(ev, TailstrictModeDisabled)
328+
i -= 1
323329
}
324330
current
325331
case s: Val.Str =>

sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,10 @@ object ManifestModule extends AbstractFunctionModule {
197197
q.add(value)
198198
while (!q.isEmpty) {
199199
q.removeFirst().value match {
200-
case v: Val.Arr => v.asLazyArray.reverseIterator.foreach(q.push)
200+
case v: Val.Arr =>
201+
val inner = v.asLazyArray
202+
var i = inner.length - 1
203+
while (i >= 0) { q.push(inner(i)); i -= 1 }
201204
case s: Val.Str => out.write(s.str)
202205
case s => Error.fail("Cannot call deepJoin on " + s.prettyName)
203206
}

0 commit comments

Comments
 (0)