difftreelog
chore re-run benchmarks
in: master
9 files changed
README.adocdiffbeforeafterboth--- a/README.adoc
+++ b/README.adoc
@@ -69,10 +69,10 @@
* https://github.com/google/jsonnet[C++];
* https://github.com/google/go-jsonnet/[Go];
* https://github.com/databricks/sjsonnet[Scala].
-* [NEW] https://github.com/eduardosm/rsjsonnet[Another Rust impl appears].
+* https://github.com/eduardosm/rsjsonnet[Another Rust impl appears].
This implementation shows performance better than all existing implementations.
-For more information see link:./docs/benchmarks.md[benchmarks]
+For more information see link:./docs/benchmarks.adoc[benchmarks]
Also, I wanted to experiment on new syntax features, and jrsonnet implements some of them.
For more information see link:./docs/features.adoc[features]
docs/benchmarks.adocdiffbeforeafterboth--- /dev/null
+++ b/docs/benchmarks.adoc
@@ -0,0 +1,2076 @@
+= Benchmarks
+
+There are multiple implementations of jsonnet implemented in different languages: Rust (this repo), https://github.com/google/go-jsonnet/[Go], https://github.com/databricks/sjsonnet[Scala], https://github.com/google/jsonnet[C++], https://github.com/moleike/haskell-jsonnet[Haskell].
+
+For simplicity, I will call these implementations by the language of their implementation.
+
+Unfortunately, I haven't managed to measure performance of Haskell implementation, because I wasn't able to build it, and there is no binaries published anywhere, so this implementation is omitted from the following benchmarks
+
+CPU: AMD Ryzen 9 9950X3D 16-Core Processor, 32 threads
+
+.Tested versions
+[%collapsible]
+====
+* Go: Jsonnet commandline interpreter (Go implementation) v0.22.0-rc1
+* C++: Jsonnet commandline interpreter v0.22.0-rc1
+* Scala (native/GraalVM): Sjsonnet 0.6.2
+* Rust (alternative): rsjsonnet 2026-03-23 (27be31532180c611383ceb2b7f03193ab1253487)
+* Rust: jrsonnet 0.5.0-pre97
+====
+
+== Real world
+
+=== Graalvm CI
+
+> Note: No results for C++, takes longer than a hour
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 34.4 ± 1.2
+| 31.8
+| 37.3
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 68.5 ± 7.2
+| 54.3
+| 87.7
+| 1.99 ± 0.22
+
+| `Go`
+| 600.3 ± 18.6
+| 566.1
+| 631.0
+| 17.47 ± 0.82
+
+| `Scala (native)`
+| 69.6 ± 4.8
+| 56.6
+| 78.8
+| 2.03 ± 0.16
+
+| `Scala (GraalVM)`
+| 65.1 ± 2.7
+| 56.9
+| 70.8
+| 1.90 ± 0.10
+|===
+
+=== Kube-prometheus manifests
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 43.6 ± 1.8
+| 38.5
+| 46.9
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 57.9 ± 2.6
+| 50.2
+| 64.5
+| 1.33 ± 0.08
+
+| `Go`
+| 1068.4 ± 16.5
+| 1033.7
+| 1090.4
+| 24.52 ± 1.10
+
+| `Scala (native)`
+| 204.6 ± 2.3
+| 201.8
+| 209.1
+| 4.70 ± 0.20
+
+| `Scala (GraalVM)`
+| 183.7 ± 2.9
+| 179.0
+| 193.3
+| 4.22 ± 0.19
+|===
+
+== Benchmarks from C++ jsonnet (/perf_tests)
+
+=== Large string join
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ text: std.join(',', std.makeArray(76846, function(_) 'x')),
+}
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 2.6 ± 0.2
+| 2.3
+| 3.9
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 12.4 ± 1.7
+| 10.1
+| 19.5
+| 4.84 ± 0.78
+
+| `Go`
+| 46.4 ± 2.9
+| 41.4
+| 55.9
+| 18.04 ± 1.90
+
+| `Scala (native)`
+| 9.7 ± 0.9
+| 8.0
+| 13.9
+| 3.77 ± 0.47
+
+| `Scala (GraalVM)`
+| 8.0 ± 0.6
+| 6.7
+| 10.7
+| 3.12 ± 0.35
+
+| `C++`
+| 39.7 ± 2.9
+| 33.2
+| 48.3
+| 15.44 ± 1.74
+|===
+
+=== Large string template
+
+> Note: No results for Go, fails with os stack size exhausion
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 2.1 ± 0.2
+| 1.8
+| 3.2
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 3.3 ± 0.3
+| 2.9
+| 4.5
+| 1.56 ± 0.21
+
+| `Scala (native)`
+| 14.5 ± 1.1
+| 12.2
+| 16.8
+| 6.91 ± 0.87
+
+| `Scala (GraalVM)`
+| 13.9 ± 0.7
+| 12.0
+| 16.0
+| 6.63 ± 0.75
+|===
+
+=== Realistic 1
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+local utils = {
+ Func3(aaaaaaa, bbbbbbb, cccc)::
+ 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/%s/XXXXX/%s/XXXXXXXXXXXXXXX/%s'
+ % [aaaaaaa, bbbbbbb, cccc],
+};
+
+
+local long_list = [
+ '001xxxxxxxxxxxxxxx-xxx',
+ '002xxxxxxxxxxxxxxxxxx-xxx',
+ '003xxxxxxxxxxxxxxxx-xxxxxxx',
+ '004xxxxxx-xxxxxx',
+ '005xxxx-xxx-xxxx',
+ '006xxx-xxx-xxxxxx',
+ '007xxx-xxx-xxxx-xxxx',
+ '008xxx-xxx-xxxx-xxxx-xxxxxxx',
+ '009xxx-xxx-xxxxx-xxxx-xxxxxxx-xxxxxx',
+ '010xxx-xxx-xxxx-xxxxxxx-xxxxxx-xxxxxxx',
+ '011xxx-xxx-xxxxx-xxxxxxxx-xxxxxxx',
+ '012xxx-xxx-xxxx-xxxxxxxx-xxxxxxx-xxxxxx',
+ '013xxx-xxx-xxxx-xxxxxxxxxx',
+ '014xxx-xxx-xxxxx-xxxxxx-xx',
+ '015xxx-xxx-xxxxxx-xxxxxxx',
+ '016xxx-xxx-xxxx-xxxxxxxx-xxxxx',
+ '017xxx-xxx-xxxx-xxxxxxxxxxxxxxx',
+ '018xxx-xxx-xxxx-xxxxxxxx-xxxxxxx-xxxxxxx',
+ '019xxx-xxx-xxxx-xxxxxxxx-xx',
+ '020xxx-xxx-xxxx-xxxxxxxxxxxxxxxx',
+ '021xxx-xxx-xxxx-xxxxxxxx-xxxxxxxxxxxx-xxx',
+ '022xxx-xxxx-xxxx-xxxx-xxxxxxx',
+ '023xxx-xxxx-xxxx-xxx-xxxxxxx-xxxxxx-xxxxxxx',
+ '024xxx-xxx-xxxx-xxx-xxxx-xxxx-xxx-xxxxxxxxx',
+ '025xxx-xxxx-xxxx-xxxxxxxxx',
+ '026xxx-xxx-xxxx-xxx-xxxxxxx',
+ '027xxx-xxx-xxxx-xxx-xxxxxxx',
+ '028xxx-xxx-xxxx-xxxxxxxxxx',
+ '029xxx-xxx-xxxx-xxxxxx',
+ '030xxx-xxx-xxxx-xxx-xxxxxxx',
+ '031xxx-xxx-xxxx-xxx-xxxxxxxx',
+ '032xxx-xxx-xxxxx-xxxxxxxxxxxx-xxxxxxx',
+ '033xxx-xxx-xxxx-xxx-xxxx-xxxx',
+ '034xxx-xxx-xxxx-xxx-xxxxxxxx-xxxxxxxx',
+ '035xxx-xxx-xxxx-xxxxxxx',
+ '036xxx-xxx-xxxx-xxxxxxxx-xxxxxxx',
+ '037xxx-xxx-xxxx-xxxxxx',
+ '038xxx-xxx-xxxx-xxxxxxxxxx',
+ '039xxxx-xxx-xxxx-xxxxxx-xxxxxx-xxxxxxx',
+ '040xxx-xxx-xxxx-xxxxxx-xxxxxxx',
+ '041xxxx-xxx-xxxx-xxxxxx-xx',
+ '042xxx-xxx-xxxx-xxxxxxxxxxx',
+ '043xxx-xxx-xxxx-xxxxxxxxxxx-xxxxxxx',
+ '044xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxx',
+ '045xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxx',
+ '046xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxx',
+ '047xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxxxxxx',
+ '048xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxxxxxxx',
+ '049xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxxxxxxxx',
+ '050xxx-xxx-xxxxx-xxxxx-xxxxxxx',
+ '051xxx-xxx-xxxx-xxxxx-xxxxxxxx-xxxxxx',
+ '052xxx-xxx-xxxx-xxxxx-xx',
+ '053xxx-xxx-xxxx-xxxx-xxxxxxx-xxx-xxxxxxx',
+ '054xxx-xxx-xxxx-xxxx-xxxxxxx-xxx-xxxxxx',
+ '055xxx-xxx-xxxx-xxx',
+ '056xxx-xxx-xxxx-xxxxxxx-xxxxxxx',
+ '057xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxxx',
+ '058xxx-xxx-xxxx-xxxxxxxxx-xxxxxx-xxxxxxx',
+ '059xxx-xxx-xxxx-xx-xxxxxxxxxxx-xxxxx',
+ '060xxx-xxx-xxxx-xxxxxxxxxxxxxx-xxxxxxx',
+ '061xxx-xxx-xxxx-xxxxxxxx-xxxxxxx',
+ '062xxx-xxx-xxxx-xxxxxxxxxxxxx-xxxxxxx',
+ '063xxx-xxx-xxxx-xxxxxx-xxxxxxx',
+ '064xxx-xxx-xxxxx-xxxxxx-xxxxxxx',
+ '065xxx-xxx-xxxx-xxxxx-xxxxx',
+ '066xxx-xxx-xxxx-xxxxx-xxxx',
+ '067xxx-xxx-xxxx-xxxxxxxxxxxxxxxxx',
+ '068xxx-xxx-xxxx-xxxxxxxx-xxxxx-xxx',
+ '069xxx-xxx-xxxx-xxxxxxxx-xx-xxx-xxxxxxxx',
+ '070xxx-xxx-xxxx-xxxxxxxx-xxxxxx-xxxxxxx',
+ '071xxx-xxx-xxxx-xxxxxxxxxx',
+ '072xxx-xxxx-xxxx-xxxxxxxxxxxxxxxx',
+ '073xxx-xxx-xxxx-xxxxxx-xxxxxx-xxxxxxx',
+ '074xxx-xxx-xxxx-xxxxxxx-xxxxxxxxxxxxx',
+ '075xxx-xxx-xxxx-xxxxxxx-xxxxxxxxxxxxx-xxxxxxxxx',
+ '076xxx-xxx-xxxx-xxxxxxxxxxxxx-xxxxxxx',
+ '077xxx-xxx-xxxx-xxxxxxxxx-xxxxxxx-x2',
+ '078xxx-xxx-xxxx-xxx',
+ '079xxx-xxx-xxxx-xxxxxxxxxxxx',
+ '080xxx-xxx-xxxx-xxxxxxxxx-xxxxxxxx',
+ '081xxx-xxx-xxxx-xxxxxxxx-xxxxxxxxx',
+ '082xxx-xxx-xxxx-xxxxxxxxx',
+ '083xxx-xxx-xxxx-xxxxxxx',
+ '084xxx-xxx-xxxx-xxxxxxx-xxxxxx',
+ '085xxxx-xxx-xxxxxxx-xxxxx-xxxx',
+ '086xxx-xxx-xxxxxxxx-xxxx-xxxxxxxxxx',
+ '087xxx-xxx-xxxxxxx-xxxxxx-xxxxxxx',
+ '088xxx-xxx-xxxxxxx-xxxxxxxx',
+ '089xxx-xxx-xxxxxxxx-xxxxxxx',
+ '090xxx-xxx-xxxxxxxx-xxxxxxx-xxxxxx',
+ '091xxx-xxxx-xxxxxxxxxx',
+ '092xxx-xxx-xxxxxx-xx',
+ '093xxx-xxx-xxxxxxx',
+ '094xxx-xxx-xxxxxxx-xxxxx',
+ '095xxx-xxx-xxxxxxxxxx',
+ '096xxx-xxx-xxxxxxxxxxxxxxx',
+ '098xxx-xxx-xxxxxxxxxxxxxxxxx',
+ '098xxx-xxx-xxxxxxxx-xxxxxxx-xxxxxxx',
+ '099xxx-xxx-xxxxxxxx-xx',
+ '100xxx-xxx-xxxx-xxxxxxxxxxx-xxxxxxx',
+ '101xxx-xxxx-xxxxxxxxxxxxxxxx',
+ '102xxx-xxx-xxxxxxxxxxxxxxxxxx',
+ '103xxx-xxx-xxxxxxxx-xxxxxxxxxxxx-xxx',
+ '104xxx-xxx-xxxx-xxxxxxx',
+ '105xxx-xxx-xxx-xxxxxxx-xxxxxx-xxxxxxx',
+ '106xxx-xxx-xxx-xxxx-xxxx-xxx-xxxxxxxxx',
+ '107xxx-xxx-xxxxxxxxx',
+ '108xxx-xxx-xxx-xxxxxxx',
+ '109xxx-xxx-xxx-xxxxxxx',
+ '110xxx-xxxx-xxxxx',
+ '111xxx-xxx-xxx-xxxx-xxxx',
+ '112xxx-xxx-xxx-xxxxxxx',
+ '113xxx-xxx-xxx-xxxxxxx',
+ '114xxx-xxx-xxxxxxxxxxxx-xxxxxxx',
+ '115xxx-xxx-xxx-xxxx-xxxx',
+ '116xxx-xxx-xxx-xxxxxxxx-xxxxxxxx',
+ '117xxx-xxx-xxxxxxx',
+ '118xxx-xxx-xxxxxxxx-xxxxxxx',
+ '119xxx-xxx-xxxxxx',
+ '120xxxx-xxx-xxxxxxxxxx',
+ '121xxx-xxx-xxxxxx-xxxxxx-xxxxxxx',
+ '122xxx-xxx-xxxxxx-xxxxxxx',
+ '123xxx-xxx-xxxxxx-xx',
+ '124xxxx-xxx-xxx-xxxx-xxxxxxx',
+ '125xxx-xxx-xxxxxxxxxxx',
+ '126xxx-xxx-xxxxxxxxxxx-xxxxxxx',
+ '127xxx-xxx-xxxxxx-xxx-xxxxxx',
+ '128xxx-xxx-xxxxxxxxxx',
+ '129xxx-xxx-xxxxxxxxxx-xxx',
+ '130xxx-xxx-xxxxx-xxxxxxx',
+ '131xxx-xxx-xxxxxx-xxxxxxxx-xxx',
+ '132xxx-xxx-xxxxx-xxxxxxxx-xxxxxx',
+ '133xxx-xxx-xxxxx-xx',
+ '134xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxxx',
+ '135xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxx',
+ '136xxx-xxx-xxxxxxxxxxxxxxx',
+ '137xxx-xxx-xxx',
+ '138xxx-xxx-xxxxxxx-xxxxxxx',
+ '139xxx-xxx-xxxxxxx-xxx-xxxxxxx',
+ '140xxx-xxx-xxxxxxxxx-xxxxxx-xxxxxxx',
+ '141xxx-xxx-xxxxxxxxxx-xxxx-xxxxxxx',
+ '142xxx-xxx-xx-xxxxxxxxxx-xxxxx',
+ '143xxx-xxx-xxxxxxxxxxxxxx-xxxxxxx',
+ '144xxx-xxx-xxxxxxxxxxxxxxxxx',
+ '145xxx-xxx-xxxxxxxx-xxxxxxx',
+ '146xxx-xxx-xxxxxxxxxxxxx-xxxxxxx',
+ '147xxx-xxx-xxxxxxx-xxxxxxx',
+ '148xxx-xxx-xxxxxx-xxxxxxx',
+ '149xxx-xxx-xxxxx-xxxxx',
+ '150xxx-xxx-xxxxx-xxxx',
+ '151xxx-xxx-xxxxxxxxxxxxxxxxx',
+ '152xxx-xxx-xxxxxxxxxxxxxxxxxxx',
+ '153xxx-xxx-xxxxxxxxx-xxxxx-xxx',
+ '154xxx-xxx-xxxxxxxx-xxxxx-xxxx-xxxx',
+ '155xxx-xxx-xxxxxxxx-xxxxxxxxxxxx-xxxx',
+ '156xxx-xxx-xxxxxxxx-xx-xxx-xxxxxxxx',
+ '157xxx-xxx-xxxxxxxx-xxxxxx-xxxxxxx',
+ '158xxx-xxx-xxxxxxxxxx',
+ '159xxx-xxx-xxxx-xxxxxx',
+ '160xxx-xxx-xxxxxxxxxx',
+ '161xxx-xxx-xxxxxxxxxxxxx',
+ '162xxx-xxx-xxxxxxxxxxxxxxxx',
+ '163xxx-xxx-xxxxx-xxxxxx-xxxxxxx',
+ '164xxx-xxx-xxxxxxx-xxxxxxxxxxxxx',
+ '165xxx-xxx-xxxxxxxxxxxxxx-xxxxxxx',
+ '166xxx-xxx-xxxxxxxxx-xxxxxxx-x2',
+ '167xxx-xxx-xxx',
+ '168xxx-xxx-xxxxxxxxxxxx',
+ '169xxx-xxx-xxxxxxxxx-xxxxxxxx',
+ '170xxx-xxx-xxxxxxxxx-xxx-xxxxxxx',
+ '171xxx-xxx-xxxxxxxxx',
+ '172xxx-xxxx-xxxxxxxxx',
+ '173xxx-xxx',
+ '174xxx-xxxxxx-xxxxxxx',
+ '175xxx-xxxxxx-xxxxxx-xxxx',
+ '176xxx-xxxxxx-xxxxx',
+ '177xxx-xxxxx-xxxxxxxx',
+ '178xxx-xxxxxx',
+ '179xxx-xxxxxxx-xxxx',
+ '180xxx-xxxxxxx-xxxx-xxxx',
+ '181xxx-xxxxxxx-xxxx-xxxxxxx',
+ '182xxx-xxxxxxx-xxxx-xxxxxxxxxxxxxxx',
+ '183xxx-xxxxxxxx-xxxx-xxxxx',
+ '184xxx-xxxxxxx-xxxx-xxxxxxx',
+ '185xxx-xxxxxxx-xxxx-xxxxxxxx-xxxxxxx',
+ '186xxx-xxxxxxx-xxxx-xxx',
+ '187xxx-xxxxxxx-xxxx-xxxxxxx-xxx-xxxxxxx',
+ '188xxx-xxxxxxx-xxxx-xxxxxxxxxxxxxx-xxxxxxx',
+ '189xxx-xxxxxxxx-xxxx-xxxxxxxxxxxxxxxxx',
+ '190xxx-xxxxxxx-xxxx-xxxxx-xxxxxx-xxxxxxx',
+ '191xxx-xxxxxxx-xxxxxxxxxx',
+ '192xxx-xxxxxxx-xxxxxxx',
+ '193xxx-xxxxxxx-xxxxxxxxxxxxxxx',
+ '194xxx-xxxxxxx-xxxxx',
+ '195xxx-xxxxxxx-xxxxxxx',
+ '196xxx-xxxxxxx-xxxxxxxx-xxxxxxx',
+ '197xxx-xxxxxxx-xxx',
+ '198xxx-xxxxxxx-xxxxxxx-xxx-xxxxxxx',
+ '199xxx-xxxxxxx-xxxxxxxxxxxxxx-xxxxxxx',
+ '200xxx-xxxxxxxx-xxxxxxxxxxxxxxxxx',
+ '201xxx-xxxxxxx-xxxxx-xxxxxx-xxxxxxx',
+ '202xxx-xxx',
+ '203xxx-xxx-xxxxxx',
+ '204xxxxxxxxx-xxx',
+ '205xxxxxxxxxxx-xxx',
+ '206xxxxxxxxx-xxxxxxx',
+ '207xxxx-xxxxxx-xxxxxxxxxxx-xxxxx1',
+ '208xxxx-xxxxxxxx-xxxxxxxx-xxxxx1',
+ '209xxxx-xxxxxxx-xxxxxxx-xxxxx1',
+ '209xxxx-xxxxxxx-xxxxxxx-xxxxx2',
+ '210xxxx-xxxx-xxxxxxx-xxxxx1',
+ '211xxxx-xxxxx-xxxxxxxx1-xxxxx1',
+ '212xxxx-xxxx-xxxxxxxx2-xxxxx1',
+ '213xxxx-xxxx-xxxxxxx1-xxxxx1',
+ '214xxxx-xxxx-xxxxxxx2-xxxxx1',
+ '215xxxxxxxxx-xxxxxx',
+ '216xxxxxxxxx-xxxxxxx',
+ '217xxxxxxxxx-xxxx',
+];
+
+{
+ 'yyyyyyyyy': {
+ local Func3(z, n) = utils.Func3('yyyyyyyyy', z, n),
+
+ global: {
+ [n]: {
+ members: [
+ Func3(z, '%s-gggg-%s-%s' % [n, z, suffix]),
+ for z in ['ooooooo-a', 'ooooooo-b', 'ooooooo-c',
+ 'ooooooo-a', 'ooooooo-b', 'ooooooo-c']
+ for suffix in ['a', 'b', 'c']
+ ],
+ }
+ for n in long_list
+ },
+ },
+}
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 5.9 ± 0.4
+| 5.4
+| 7.4
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 7.8 ± 0.4
+| 7.1
+| 9.2
+| 1.31 ± 0.11
+
+| `Go`
+| 3158.3 ± 65.5
+| 3011.3
+| 3245.6
+| 531.91 ± 35.10
+
+| `Scala (native)`
+| 12.7 ± 0.9
+| 10.6
+| 15.9
+| 2.15 ± 0.21
+
+| `Scala (GraalVM)`
+| 13.8 ± 0.8
+| 11.7
+| 17.2
+| 2.32 ± 0.20
+|===
+
+=== Realistic 2
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+local rfc3339(timestamp) = '1970-01-01T00:00:00Z';
+
+local name1(a, b, c) =
+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%sBBBBBBB%sCCCCCCCCCCC%s'
+ % [a, b, c];
+
+local name2(x) =
+ 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%s' % x;
+
+local T1 = 'PPPPPPPPPPPPPPPPPPPPPPP';
+local T2 = 'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ';
+
+local LOCATIONS = [
+ 'europe-west1-b',
+ 'europe-west1-c',
+ 'europe-west1-d',
+ 'europe-west2-a',
+ 'europe-west2-b',
+ 'europe-west2-c',
+ 'europe-west3-a',
+ 'europe-west3-b',
+ 'europe-west3-c',
+ 'europe-west4-a',
+ 'europe-west4-b',
+ 'europe-west4-c',
+ 'us-central1-a',
+ 'us-central1-b',
+ 'us-central1-c',
+ 'us-central1-f',
+ 'us-east1-b',
+ 'us-east1-c',
+ 'us-east1-d',
+ 'us-east4-a',
+ 'us-east4-b',
+ 'us-east4-c',
+ 'us-west1-a',
+ 'us-west1-b',
+ 'us-west1-c',
+];
+
+
+// The return value is a function to allow it to be parameterized.
+function(
+ timestamp=0,
+ x='xxxxxxxxxxxxxxxxxxx',
+ prefix='prefix',
+ num1=50,
+ count=25,
+ offset=0,
+)
+ local rfc_timestamp = rfc3339(timestamp);
+
+ local func1(i) =
+ local location = LOCATIONS[i % std.length(LOCATIONS)];
+ [
+ local name = '%s-%000d-%000d' % [prefix, i, j];
+ {
+ field_zz1: rfc_timestamp,
+ fie_z2: {
+ field_z3: name1(x, location, name),
+ field_zzzzzzzzzz4: name2(x),
+ field_zzz5: [name],
+ field_z6: T1,
+ field_z7: location,
+ fi_8: '???',
+ fiel_z9: '99',
+ },
+ }
+ for j in std.range(0, num1 - 1)
+ ];
+
+ local func2(i) =
+ local location = LOCATIONS[i % std.length(LOCATIONS)];
+ local all = [
+ name1(x, location, '%s-%000d-%000d' % [prefix, i, j])
+ for j in std.range(0, num1 - 1)
+ ];
+ [
+ {
+ field_yy1: rfc_timestamp,
+ field_yyyyy2: 'EEEE',
+ field_yyyyy3: {
+ field_y4: T2,
+ field_yyyyyyy5: p,
+ field_yyyyyyy6: q,
+ },
+ }
+ for p in all
+ for q in all
+ if p != q
+ ];
+
+
+ {
+ field_x1: '-----',
+ field_xxxxxxxxxxxxxxxx2: std.join([], [
+ func1(offset * count + i)
+ for i in std.range(0, count - 1)
+ ]),
+ field_xxxxxxxxxxxxxxxxxxxxxx3: std.join([], [
+ func2(offset * count + i)
+ for i in std.range(0, count - 1)
+ ]),
+ }
+
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 120.9 ± 3.5
+| 114.0
+| 127.1
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 163.4 ± 3.8
+| 154.4
+| 170.6
+| 1.35 ± 0.05
+
+| `Go`
+| 3160.3 ± 54.6
+| 3034.7
+| 3242.9
+| 26.15 ± 0.87
+
+| `Scala (native)`
+| 417.8 ± 4.2
+| 405.6
+| 426.0
+| 3.46 ± 0.10
+
+| `Scala (GraalVM)`
+| 409.1 ± 4.5
+| 401.8
+| 421.4
+| 3.39 ± 0.10
+|===
+
+== Benchmarks from C++ jsonnet (/benchmarks)
+
+=== Tail call
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+/*
+Copyright 2015 Google Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+local sum(x) =
+ if x == 0 then
+ 0
+ else
+ x + sum(x - 1);
+sum(300)
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 865.2 ± 106.0
+| 723.0
+| 1544.2
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1200.9 ± 144.0
+| 1030.4
+| 2238.5
+| 1.39 ± 0.24
+
+| `Go`
+| 2559.0 ± 187.5
+| 2033.0
+| 3289.3
+| 2.96 ± 0.42
+
+| `Scala (native)`
+| 2406.8 ± 227.0
+| 2030.4
+| 3547.3
+| 2.78 ± 0.43
+
+| `Scala (GraalVM)`
+| 1858.1 ± 184.4
+| 1434.9
+| 2770.1
+| 2.15 ± 0.34
+
+| `C++`
+| 18460.1 ± 1115.1
+| 16827.0
+| 22068.8
+| 21.34 ± 2.91
+|===
+
+=== Inheritance recursion
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+/*
+Copyright 2015 Google Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+local Fib = {
+ n: 1,
+ local outer = self,
+ r: if self.n <= 1 then 1 else (Fib { n: outer.n - 1 }).r + (Fib { n: outer.n - 2 }).r,
+};
+
+(Fib { n: 25 }).r
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 160.1 ± 2.0
+| 155.9
+| 163.7
+| 3.43 ± 0.10
+
+| `Rust (alternative, rsjsonnet)`
+| 115.6 ± 1.6
+| 113.5
+| 119.3
+| 2.48 ± 0.07
+
+| `Go`
+| 444.7 ± 8.6
+| 429.2
+| 467.9
+| 9.52 ± 0.31
+
+| `Scala (native)`
+| 46.7 ± 1.2
+| 44.3
+| 50.2
+| 1.00
+
+| `Scala (GraalVM)`
+| 58.3 ± 1.6
+| 55.1
+| 61.5
+| 1.25 ± 0.05
+
+| `C++`
+| 1216.9 ± 9.0
+| 1204.7
+| 1237.2
+| 26.06 ± 0.69
+|===
+
+=== Simple recursive call
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+/*
+Copyright 2015 Google Inc. All rights reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+local fibonacci(n) =
+ if n <= 1 then
+ 1
+ else
+ fibonacci(n - 1) + fibonacci(n - 2);
+
+fibonacci(25)
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 35.8 ± 0.7
+| 34.1
+| 37.5
+| 1.99 ± 0.10
+
+| `Rust (alternative, rsjsonnet)`
+| 39.9 ± 1.6
+| 37.6
+| 48.9
+| 2.22 ± 0.13
+
+| `Go`
+| 194.3 ± 4.2
+| 187.4
+| 205.0
+| 10.81 ± 0.54
+
+| `Scala (native)`
+| 18.0 ± 0.8
+| 16.5
+| 20.6
+| 1.00
+
+| `Scala (GraalVM)`
+| 25.2 ± 0.9
+| 23.2
+| 28.4
+| 1.40 ± 0.08
+
+| `C++`
+| 78.8 ± 1.5
+| 74.9
+| 82.1
+| 4.38 ± 0.21
+|===
+
+=== Foldl string concat
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+std.foldl(function(e, res) e + res, std.makeArray(20000, function(i) 'aaaaa'), '')
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 3.7 ± 0.3
+| 3.4
+| 5.0
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 96.0 ± 1.7
+| 94.2
+| 99.7
+| 25.82 ± 2.05
+
+| `Go`
+| 4076.3 ± 32.7
+| 4016.9
+| 4129.6
+| 1096.62 ± 85.35
+
+| `Scala (native)`
+| 328.6 ± 33.7
+| 267.8
+| 406.5
+| 88.40 ± 11.37
+
+| `Scala (GraalVM)`
+| 420.9 ± 10.7
+| 387.9
+| 436.4
+| 113.22 ± 9.23
+
+| `C++`
+| 564.6 ± 6.1
+| 551.0
+| 575.6
+| 151.90 ± 11.88
+|===
+
+=== Array sorts
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+// A benchmark for builtin sort
+
+local reverse = std.reverse;
+local sort = std.sort;
+
+true
+&& std.assertEqual(std.range(1, 500), sort(std.range(1, 500)))
+&& std.assertEqual(std.range(1, 1000), sort(std.range(1, 1000)))
+&& std.assertEqual(reverse(std.range(1, 1000)), sort(std.range(1, 1000), keyF=function(x) -x))
+&& std.assertEqual(std.range(1, 1000), sort(reverse(std.range(1, 1000))))
+&& std.assertEqual(std.makeArray(2000, function(i) std.floor((i + 2) / 2)), sort(std.range(1, 1000) + reverse(std.range(1, 1000))))
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 1.3 ± 0.1
+| 1.2
+| 2.3
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 3.4 ± 0.2
+| 3.1
+| 5.5
+| 2.52 ± 0.30
+
+| `Go`
+| 5.4 ± 0.3
+| 4.8
+| 6.5
+| 4.05 ± 0.43
+
+| `Scala (native)`
+| 4.2 ± 0.4
+| 3.5
+| 5.8
+| 3.09 ± 0.41
+
+| `Scala (GraalVM)`
+| 3.0 ± 0.3
+| 2.4
+| 5.1
+| 2.21 ± 0.30
+
+| `C++`
+| 2057.1 ± 19.0
+| 2020.1
+| 2093.3
+| 1531.53 ± 146.37
+|===
+
+=== Lazy array
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+local f2(f) = function(x) f(f(x));
+local id(x) = x;
+
+local slowId = std.makeArray(20, function(i) if i == 0 then id else f2(slowId[i - 1]));
+
+slowId[15](42)
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 54.8 ± 6.6
+| 42.7
+| 65.5
+| 5.12 ± 0.72
+
+| `Rust (alternative, rsjsonnet)`
+| 10.7 ± 0.8
+| 9.6
+| 14.7
+| 1.00
+
+| `Go`
+| 385.8 ± 8.2
+| 373.7
+| 402.5
+| 36.03 ± 2.72
+
+| `Scala (native)`
+| 19.3 ± 1.4
+| 15.9
+| 22.1
+| 1.81 ± 0.18
+
+| `Scala (GraalVM)`
+| 18.5 ± 1.4
+| 14.1
+| 21.2
+| 1.72 ± 0.18
+
+| `C++`
+| 103.5 ± 2.5
+| 99.3
+| 109.7
+| 9.67 ± 0.74
+|===
+
+=== Inheritance function recursion
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+local fibnext = {
+ a: super.a + super.b,
+ b: super.a,
+};
+local fib(n) =
+ if n == 0 then
+ { a: 1, b: 1 }
+ else
+ fib(n - 1) + fibnext;
+
+fib(25)
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 743.5 ± 89.5
+| 625.2
+| 1784.7
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1180.2 ± 144.6
+| 1017.7
+| 2210.2
+| 1.59 ± 0.27
+
+| `Go`
+| 1414.3 ± 71.8
+| 1174.2
+| 2001.0
+| 1.90 ± 0.25
+
+| `Scala (native)`
+| 2394.1 ± 237.9
+| 2011.3
+| 4013.8
+| 3.22 ± 0.50
+
+| `Scala (GraalVM)`
+| 1814.9 ± 205.1
+| 1439.8
+| 2826.0
+| 2.44 ± 0.40
+
+| `C++`
+| 789224.2 ± 7732.9
+| 768789.6
+| 805741.8
+| 1061.50 ± 128.22
+|===
+
+=== String strips
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+// This string must be longer than max stack frames
+local veryLongString = std.join('', std.repeat(['e'], 510));
+
+std.assertEqual(std.stripChars(veryLongString + 'ok' + veryLongString, 'e'), 'ok') &&
+std.assertEqual(std.lstripChars(veryLongString + 'ok', 'e'), 'ok') &&
+std.assertEqual(std.rstripChars('ok' + veryLongString, 'e'), 'ok') &&
+
+true
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 751.5 ± 98.9
+| 625.9
+| 1451.6
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1182.3 ± 147.4
+| 1018.3
+| 2328.8
+| 1.57 ± 0.29
+
+| `Go`
+| 5375.9 ± 293.0
+| 4843.7
+| 6930.0
+| 7.15 ± 1.02
+
+| `Scala (native)`
+| 2377.2 ± 226.5
+| 2029.3
+| 3675.7
+| 3.16 ± 0.51
+
+| `Scala (GraalVM)`
+| 1884.6 ± 188.5
+| 1486.8
+| 3105.8
+| 2.51 ± 0.41
+|===
+
+=== Big object
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+// Generator source
+local n = 2000;
+
+local objLocal(name, body) = 'local ' + name + ' = ' + body + ',';
+local objField(name, body) = name + ': ' + body + ',';
+
+local allLocals =
+ std.makeArray(n, function(i) objLocal('l' + i, '1'));
+
+local allFields =
+ std.makeArray(n, function(i) objField('f' + i, '2'));
+
+local indent = ' ';
+local indentAndSeparate(s) = indent + s + '\n';
+
+local objContents = std.map(indentAndSeparate, allLocals + allFields);
+
+local objectBody = std.join('', objContents);
+'{\n' + objectBody + '}\n'
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 839.2 ± 97.2
+| 704.3
+| 1562.2
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1312.8 ± 146.1
+| 1129.8
+| 2440.5
+| 1.56 ± 0.25
+
+| `Go`
+| 2544.5 ± 118.7
+| 2262.5
+| 3078.4
+| 3.03 ± 0.38
+
+| `Scala (native)`
+| 3756.8 ± 386.3
+| 3205.7
+| 5865.4
+| 4.48 ± 0.69
+
+| `Scala (GraalVM)`
+| 3035.7 ± 269.8
+| 2498.4
+| 4461.3
+| 3.62 ± 0.53
+
+| `C++`
+| 16199.6 ± 864.3
+| 14763.2
+| 19331.2
+| 19.30 ± 2.46
+|===
+
+== Benchmarks from Go jsonnet (builtins)
+
+=== std.base64
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.base64("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus.") for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 1.2 ± 0.1
+| 1.1
+| 2.4
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 2.3 ± 0.2
+| 2.1
+| 3.5
+| 1.89 ± 0.27
+
+| `Go`
+| 8.1 ± 0.4
+| 7.4
+| 9.8
+| 6.54 ± 0.79
+
+| `Scala (native)`
+| 4.8 ± 0.4
+| 4.1
+| 6.6
+| 3.89 ± 0.56
+
+| `Scala (GraalVM)`
+| 3.5 ± 0.3
+| 2.9
+| 4.6
+| 2.83 ± 0.38
+|===
+
+=== std.base64Decode
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.base64Decode("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4=") for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 1.2 ± 0.1
+| 1.1
+| 2.2
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 2.8 ± 0.2
+| 2.6
+| 4.1
+| 2.37 ± 0.32
+
+| `Go`
+| 7.4 ± 0.4
+| 6.8
+| 10.5
+| 6.21 ± 0.77
+
+| `Scala (native)`
+| 4.2 ± 0.4
+| 3.6
+| 5.6
+| 3.57 ± 0.52
+
+| `Scala (GraalVM)`
+| 3.1 ± 0.2
+| 2.5
+| 4.2
+| 2.58 ± 0.36
+
+| `C++`
+| 4819.0 ± 22.8
+| 4775.1
+| 4863.2
+| 4068.77 ± 454.41
+|===
+
+=== std.base64DecodeBytes
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.base64DecodeBytes("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4=") for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 19.2 ± 0.9
+| 17.5
+| 23.8
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 44.5 ± 2.2
+| 41.1
+| 48.9
+| 2.32 ± 0.16
+
+| `Go`
+| 115.3 ± 2.5
+| 111.0
+| 120.1
+| 6.01 ± 0.32
+
+| `Scala (native)`
+| 37.2 ± 2.2
+| 32.0
+| 41.6
+| 1.94 ± 0.15
+
+| `Scala (GraalVM)`
+| 28.7 ± 0.9
+| 27.2
+| 31.4
+| 1.49 ± 0.09
+
+| `C++`
+| 4643.4 ± 18.6
+| 4612.8
+| 4678.5
+| 242.13 ± 11.89
+|===
+
+=== std.base64 (byte array)
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.base64([76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115]),for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 15.6 ± 0.5
+| 14.8
+| 17.3
+| 2.48 ± 0.16
+
+| `Rust (alternative, rsjsonnet)`
+| 14.3 ± 0.5
+| 13.3
+| 15.6
+| 2.26 ± 0.15
+
+| `Go`
+| 63.8 ± 2.8
+| 57.3
+| 69.1
+| 10.10 ± 0.74
+
+| `Scala (native)`
+| 7.1 ± 0.6
+| 6.1
+| 8.9
+| 1.12 ± 0.11
+
+| `Scala (GraalVM)`
+| 6.3 ± 0.4
+| 5.5
+| 7.7
+| 1.00
+
+| `C++`
+| 7040.2 ± 47.1
+| 6967.5
+| 7138.0
+| 1114.18 ± 64.89
+|===
+
+=== std.foldl
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+local input = std.makeArray(10000, function(i) 'xxxxx');
+
+std.foldl(function(acc, value) acc + value, input, '')
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 2.2 ± 0.2
+| 2.0
+| 3.4
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 26.7 ± 1.8
+| 22.5
+| 31.0
+| 12.07 ± 1.31
+
+| `Go`
+| 1043.0 ± 18.2
+| 1007.5
+| 1076.2
+| 470.67 ± 40.53
+
+| `Scala (native)`
+| 80.0 ± 4.1
+| 72.6
+| 87.4
+| 36.11 ± 3.55
+
+| `Scala (GraalVM)`
+| 55.4 ± 4.5
+| 44.3
+| 63.8
+| 24.98 ± 2.93
+
+| `C++`
+| 167.7 ± 3.2
+| 161.3
+| 173.6
+| 75.67 ± 6.55
+|===
+
+=== std.manifestJsonEx
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ bar: {
+ prometheusOperator+: {
+ service+: {
+ spec+: {
+ ports: [
+ {
+ name: 'https',
+ port: 8443,
+ targetPort: 'https',
+ },
+ ],
+ },
+ },
+ serviceMonitor+: {
+ spec+: {
+ endpoints: [
+ {
+ port: 'https',
+ scheme: 'https',
+ honorLabels: true,
+ bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+ tlsConfig: {
+ insecureSkipVerify: true,
+ },
+ },
+ ]
+ },
+ },
+ clusterRole+: {
+ rules+: [
+ {
+ apiGroups: ['authentication.k8s.io'],
+ resources: ['tokenreviews'],
+ verbs: ['create'],
+ },
+ {
+ apiGroups: ['authorization.k8s.io'],
+ resources: ['subjectaccessreviews'],
+ verbs: ['create'],
+ },
+ ],
+ },
+ }
+ },
+ foo: std.manifestJsonEx(self.bar, " ")
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 748.5 ± 89.4
+| 618.9
+| 1457.9
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1173.6 ± 132.1
+| 1020.2
+| 2213.3
+| 1.57 ± 0.26
+
+| `Go`
+| 1426.9 ± 76.1
+| 1206.5
+| 2024.4
+| 1.91 ± 0.25
+
+| `Scala (native)`
+| 2443.6 ± 215.6
+| 2080.3
+| 3535.8
+| 3.26 ± 0.48
+
+| `Scala (GraalVM)`
+| 1867.9 ± 187.6
+| 1510.0
+| 2727.7
+| 2.50 ± 0.39
+
+| `C++`
+| 56868.5 ± 1565.7
+| 53376.4
+| 59440.7
+| 75.97 ± 9.32
+|===
+
+=== std.manifestTomlEx
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ bar: {
+ prometheusOperator+: {
+ service+: {
+ spec+: {
+ ports: [
+ {
+ name: 'https',
+ port: 8443,
+ targetPort: 'https',
+ },
+ ],
+ },
+ },
+ serviceMonitor+: {
+ spec+: {
+ endpoints: [
+ {
+ port: 'https',
+ scheme: 'https',
+ honorLabels: true,
+ bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+ tlsConfig: {
+ insecureSkipVerify: true,
+ },
+ },
+ ],
+ },
+ },
+ clusterRole+: {
+ rules+: [
+ {
+ apiGroups: ['authentication.k8s.io'],
+ resources: ['tokenreviews'],
+ verbs: ['create'],
+ },
+ {
+ apiGroups: ['authorization.k8s.io'],
+ resources: ['subjectaccessreviews'],
+ verbs: ['create'],
+ },
+ ],
+ },
+ },
+ },
+ nothing: std.manifestTomlEx(self.bar, ' '),
+}
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 750.5 ± 92.9
+| 624.9
+| 1531.7
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1190.8 ± 141.6
+| 1007.4
+| 2224.5
+| 1.59 ± 0.27
+
+| `Go`
+| 1427.7 ± 82.5
+| 1217.9
+| 1923.1
+| 1.90 ± 0.26
+
+| `Scala (native)`
+| 2558.8 ± 258.8
+| 2168.4
+| 3590.2
+| 3.41 ± 0.54
+
+| `Scala (GraalVM)`
+| 1940.1 ± 185.3
+| 1568.4
+| 3078.2
+| 2.59 ± 0.40
+
+| `C++`
+| 519148.2 ± 5114.2
+| 512290.7
+| 527415.7
+| 691.74 ± 85.90
+|===
+
+=== std.parseInt
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.parseInt("-123949595") for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 771.7 ± 99.3
+| 633.6
+| 1465.7
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1177.7 ± 135.4
+| 1030.0
+| 2068.3
+| 1.53 ± 0.26
+
+| `Go`
+| 1398.2 ± 78.8
+| 1203.3
+| 1922.2
+| 1.81 ± 0.25
+
+| `Scala (native)`
+| 2383.6 ± 227.4
+| 2008.7
+| 3848.0
+| 3.09 ± 0.49
+
+| `Scala (GraalVM)`
+| 1809.3 ± 167.6
+| 1430.0
+| 2685.7
+| 2.34 ± 0.37
+
+| `C++`
+| 53474.0 ± 1377.1
+| 50862.9
+| 56321.0
+| 69.30 ± 9.10
+|===
+
+=== std.reverse
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.reverse(std.range(0, 5000)) for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 24.5 ± 1.1
+| 22.5
+| 27.5
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 54.6 ± 2.3
+| 51.0
+| 63.3
+| 2.23 ± 0.13
+
+| `Go`
+| 138.8 ± 2.4
+| 136.2
+| 145.1
+| 5.67 ± 0.27
+
+| `Scala (native)`
+| 44.1 ± 2.4
+| 38.2
+| 47.7
+| 1.80 ± 0.13
+
+| `Scala (GraalVM)`
+| 36.0 ± 1.3
+| 32.5
+| 38.7
+| 1.47 ± 0.08
+
+| `C++`
+| 339.8 ± 2.1
+| 336.1
+| 344.3
+| 13.88 ± 0.61
+|===
+
+=== std.substr
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+{
+ foo: [
+ std.substr("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. ", i, 800-i) for i in std.range(0,100)
+ ],
+}
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [µs]
+| Min [µs]
+| Max [µs]
+| Relative
+
+| `Rust`
+| 917.8 ± 100.9
+| 786.2
+| 1720.6
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 1542.7 ± 165.7
+| 1356.8
+| 2708.1
+| 1.68 ± 0.26
+
+| `Go`
+| 3294.1 ± 238.4
+| 2784.6
+| 4146.2
+| 3.59 ± 0.47
+
+| `Scala (native)`
+| 2991.7 ± 287.0
+| 2557.2
+| 4080.4
+| 3.26 ± 0.48
+
+| `Scala (GraalVM)`
+| 2261.4 ± 199.8
+| 1831.2
+| 3287.4
+| 2.46 ± 0.35
+
+| `C++`
+| 16726.5 ± 994.8
+| 15091.1
+| 19537.3
+| 18.22 ± 2.28
+|===
+
+=== Comparsion for array
+
+> Note: No results for C++, too slow, takes hours, skews results
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+local long_array = std.range(1, 1000000);
+long_array + [1] < long_array + [2]
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 10.0 ± 0.5
+| 9.3
+| 12.6
+| 1.00
+
+| `Rust (alternative, rsjsonnet)`
+| 70.6 ± 4.8
+| 54.7
+| 81.3
+| 7.05 ± 0.60
+
+| `Go`
+| 77.3 ± 7.5
+| 54.9
+| 87.4
+| 7.72 ± 0.84
+
+| `Scala (native)`
+| 39.1 ± 2.6
+| 30.4
+| 42.7
+| 3.90 ± 0.33
+
+| `Scala (GraalVM)`
+| 64.3 ± 2.1
+| 60.7
+| 70.2
+| 6.42 ± 0.38
+|===
+
+=== Comparsion for primitives
+
+> Note: No results for C++, can't run: uses up to 192GB of RAM
+
+.Source
+[%collapsible]
+====
+[source,jsonnet]
+----
+([ i < j for i in std.range(1, 1000) for j in std.range(1, 1000)])
+
+----
+====
+
+[cols="<,>,>,>,>"]
+|===
+| Command
+| Mean [ms]
+| Min [ms]
+| Max [ms]
+| Relative
+
+| `Rust`
+| 218.1 ± 4.4
+| 206.9
+| 227.4
+| 1.25 ± 0.04
+
+| `Rust (alternative, rsjsonnet)`
+| 432.2 ± 7.4
+| 426.2
+| 458.6
+| 2.47 ± 0.08
+
+| `Go`
+| 892.8 ± 25.8
+| 860.6
+| 992.0
+| 5.11 ± 0.20
+
+| `Scala (native)`
+| 174.8 ± 4.6
+| 168.1
+| 183.7
+| 1.00
+
+| `Scala (GraalVM)`
+| 204.1 ± 4.6
+| 198.9
+| 221.1
+| 1.17 ± 0.04
+|===
docs/benchmarks.mddiffbeforeafterboth--- a/docs/benchmarks.md
+++ /dev/null
@@ -1,1396 +0,0 @@
-# Benchmarks
-
-There are multiple implementations of jsonnet implemented in different languages: Rust (this repo), [Go](https://github.com/google/go-jsonnet/), [Scala](https://github.com/databricks/sjsonnet), [C++](https://github.com/google/jsonnet), [Haskell](https://github.com/moleike/haskell-jsonnet).
-
-For simplicity, I will call these implementations by the language of their implementation.
-
-Unfortunately, I haven't managed to measure performance of Haskell implementation, because I wasn't able to build it, and there is no binaries published anywhere, so this implementation is omitted from the following benchmarks
-
-<details>
-<summary>Tested versions</summary>
-
-Go: Jsonnet commandline interpreter (Go implementation) v0.20.0
-
-```
-Jsonnet commandline interpreter (Go implementation) v0.20.0
-
-jsonnet {<option>} <filename>
-
-Available options:
- -h / --help This message
- -e / --exec Treat filename as code
- -J / --jpath <dir> Specify an additional library search dir
- (right-most wins)
- -o / --output-file <file> Write to the output file rather than stdout
- -m / --multi <dir> Write multiple files to the directory, list files
- on stdout
- -c / --create-output-dirs Automatically creates all parent directories for
- files
- -y / --yaml-stream Write output as a YAML stream of JSON documents
- -S / --string Expect a string, manifest as plain text
- -s / --max-stack <n> Number of allowed stack frames
- -t / --max-trace <n> Max length of stack trace before cropping
- --version Print version
-
-Available options for specifying values of 'external' variables:
- Provide the value as a string:
- -V / --ext-str <var>[=<val>] If <val> is omitted, get from environment
- var <var>
- --ext-str-file <var>=<file> Read the string from the file
- Provide a value as Jsonnet code:
- --ext-code <var>[=<code>] If <code> is omitted, get from environment
- var <var>
- --ext-code-file <var>=<file> Read the code from the file
-
-Available options for specifying values of 'top-level arguments':
- Provide the value as a string:
- -A / --tla-str <var>[=<val>] If <val> is omitted, get from environment
- var <var>
- --tla-str-file <var>=<file> Read the string from the file
- Provide a value as Jsonnet code:
- --tla-code <var>[=<code>] If <code> is omitted, get from environment
- var <var>
- --tla-code-file <var>=<file> Read the code from the file
-
-Environment variables:
- JSONNET_PATH is a colon (semicolon on Windows) separated list of directories
- added in reverse order before the paths specified by --jpath (i.e. left-most
- wins). E.g. these are equivalent:
- JSONNET_PATH=a:b jsonnet -J c -J d
- JSONNET_PATH=d:c:a:b jsonnet
- jsonnet -J b -J a -J c -J d
-
-In all cases:
- <filename> can be - (stdin)
- Multichar options are expanded e.g. -abc becomes -a -b -c.
- The -- option suppresses option processing for subsequent arguments.
- Note that since filenames and jsonnet programs can begin with -, it is
- advised to use -- if the argument is unknown, e.g. jsonnet -- "$FILENAME".
-```
-
-C++: Jsonnet commandline interpreter v0.20.0
-
-```
-Jsonnet commandline interpreter v0.20.0
-
-jsonnet {<option>} <filename>
-
-Available options:
- -h / --help This message
- -e / --exec Treat filename as code
- -J / --jpath <dir> Specify an additional library search dir (right-most wins)
- -o / --output-file <file> Write to the output file rather than stdout
- -m / --multi <dir> Write multiple files to the directory, list files on stdout
- -y / --yaml-stream Write output as a YAML stream of JSON documents
- -S / --string Expect a string, manifest as plain text
- -s / --max-stack <n> Number of allowed stack frames
- -t / --max-trace <n> Max length of stack trace before cropping
- --gc-min-objects <n> Do not run garbage collector until this many
- --gc-growth-trigger <n> Run garbage collector after this amount of object growth
- --version Print version
-Available options for specifying values of 'external' variables:
-Provide the value as a string:
- -V / --ext-str <var>[=<val>] If <val> is omitted, get from environment var <var>
- --ext-str-file <var>=<file> Read the string from the file
-Provide a value as Jsonnet code:
- --ext-code <var>[=<code>] If <code> is omitted, get from environment var <var>
- --ext-code-file <var>=<file> Read the code from the file
-Available options for specifying values of 'top-level arguments':
-Provide the value as a string:
- -A / --tla-str <var>[=<val>] If <val> is omitted, get from environment var <var>
- --tla-str-file <var>=<file> Read the string from the file
-Provide a value as Jsonnet code:
- --tla-code <var>[=<code>] If <code> is omitted, get from environment var <var>
- --tla-code-file <var>=<file> Read the code from the file
-Environment variables:
-JSONNET_PATH is a colon (semicolon on Windows) separated list of directories added
-in reverse order before the paths specified by --jpath (i.e. left-most wins)
-E.g. JSONNET_PATH=a:b jsonnet -J c -J d is equivalent to:
-JSONNET_PATH=d:c:a:b jsonnet
-jsonnet -J b -J a -J c -J d
-
-In all cases:
-<filename> can be - (stdin)
-Multichar options are expanded e.g. -abc becomes -a -b -c.
-The -- option suppresses option processing for subsequent arguments.
-Note that since filenames and jsonnet programs can begin with -, it is advised to
-use -- if the argument is unknown, e.g. jsonnet -- "$FILENAME".
-```
-
-Scala:
-
-```
-Missing argument: file <str>
-Expected Signature: Sjsonnet 0.4.10
-usage: sjsonnet [sjsonnet-options] script-file
- -i --interactive Run Mill in interactive mode, suitable for opening REPLs and
- taking user input
- -J --jpath <str> Specify an additional library search dir (right-most wins)
- -o --output-file <str> Write to the output file rather than stdout
- -m --multi <str> Write multiple files to the directory, list files on stdout
- -c --create-output-dirs Automatically creates all parent directories for files
- -y --yaml-stream Write output as a YAML stream of JSON documents
- -S --string Expect a string, manifest as plain text
- -V --ext-str <str> <var>[=<val>] Provide 'external' variable as string. 'If
- <val> is omitted, get from environment var <var>
- --ext-str-file <str> <var>=<file> Provide 'external' variable as string from the
- file
- -V --ext-code <str> <var>[=<code>] Provide 'external' variable as Jsonnet code.
- If <code> is omitted, get from environment var <var>
- --ext-code-file <str> <var>=<file> Provide 'external' variable as Jsonnet code
- from the file
- -A --tla-str <str> <var>[=<val>] Provide top-level arguments as string. 'If
- <val> is omitted, get from environment var <var>
- --tla-str-file <str> <var>=<file> Provide top-level arguments variable as string
- from the file
- -V --tla-code <str> <var>[=<val>] Provide top-level arguments as Jsonnet code.
- 'If <val> is omitted, get from environment var <var>
- --tla-code-file <str> <var>=<file> Provide top-level arguments variable as Jsonnet
- code from the file
- -n --indent <int> How much to indent your output JSON
- -p --preserve-order Preserves order of keys in the resulting JSON
- --strict Enforce some additional syntax limitations
- --yaml-out Write output as a YAML document
- file <str> The jsonnet file you wish to evaluate
- --yaml-debug Generate source line comments in the output YAML doc to make
- it easier to figure out where values come from.
- --no-static-errors Turn static errors into warnings
- --fatal-warnings Fail if any warnings were emitted
- -e --exec Evaluate the given string as Jsonnet rather than treating it
- as a file name
- --no-duplicate-keys-in-comprehension Raise an error if an object comprehension contains duplicate
- keys
- --strict-import-syntax Raise an error if import expressions are used without proper
- parentheses, e.g. import "foo".bar rather than (import
- "foo").bar
- --strict-inherited-assertions Properly handle assertions defined in a Jsonnet dictionary
- that is extended more than once
-
-
-```
-
-Rust (alternative):
-
-```
-Usage: rsjsonnet [OPTIONS] <filename>
-
-Arguments:
- <filename>
-
-Options:
- -e, --exec Treat filename as code
- -J, --jpath <dir> Specify an additional library search dir (right-most wins)
- -o, --output-file <file> Write to the output file rather than stdout
- -m, --multi <dir> Write multiple files to the directory, list files on stdout
- -y, --yaml-stream Write output as a YAML stream of JSON documents
- -S, --string Expect a string, manifest as plain text
- -s, --max-stack <n> Number of allowed stack frames
- -t, --max-trace <n> Max length of stack trace before cropping
- -V, --ext-str <var=[val]>
- --ext-str-file <var=file>
- --ext-code <var[=code]>
- --ext-code-file <var=file>
- -A, --tla-str <var[=val]>
- --tla-str-file <var=file>
- --tla-code <var[=code]>
- --tla-code-file <var=file>
- -h, --help Print help
-
-```
-
-</details>
-
-## Real world
-
-### Graalvm CI
-
-> Note: No results for C++, takes longer than a hour
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-# Common
-local common = import 'common.jsonnet';
-local graal_common = import 'graal-common.json';
-
-# Compiler
-local compiler = import 'compiler/ci/ci.jsonnet';
-
-# GraalWasm
-local wasm = import 'wasm/ci/ci.jsonnet';
-
-# Espresso
-local espresso = import 'espresso/ci/ci.jsonnet';
-
-# Regex
-local regex = import 'regex/ci/ci.jsonnet';
-
-# SDK
-local sdk = import 'sdk/ci/ci.jsonnet';
-
-# SubstrateVM
-local substratevm = import 'substratevm/ci/ci.jsonnet';
-
-# Sulong
-local sulong = import 'sulong/ci/ci.jsonnet';
-
-# Tools
-local tools = import 'tools/ci/ci.jsonnet';
-
-# Truffle
-local truffle = import 'truffle/ci/ci.jsonnet';
-
-# JavaDoc
-local javadoc = import "ci_includes/publish-javadoc.jsonnet";
-
-# VM
-local vm = import 'vm/ci/ci_includes/vm.jsonnet';
-
-local verify_ci = (import 'ci-check.libsonnet').verify_ci;
-
-{
- # Ensure that entries in common.jsonnet can be resolved.
- _checkCommon: (import 'common.jsonnet'),
- ci_resources:: (import 'ci-resources.libsonnet'),
- overlay: graal_common.ci.overlay,
- specVersion: "3",
- builds: [common.add_excludes_guard(b) for b in (
- compiler.builds +
- wasm.builds +
- espresso.builds +
- regex.builds +
- sdk.builds +
- substratevm.builds +
- sulong.builds +
- tools.builds +
- truffle.builds +
- javadoc.builds +
- vm.builds
- )],
- assert verify_ci(self.builds),
- // verify that the run-spec demo works
- assert (import "ci/ci_common/run-spec-demo.jsonnet").check(),
-}
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 93.6 ± 0.6 | 92.5 | 94.7 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 263.3 ± 1.8 | 259.0 | 268.4 | 2.81 ± 0.03 |
-| `Go` | 1204.6 ± 5.0 | 1196.0 | 1215.4 | 12.87 ± 0.10 |
-| `Scala` | 720.0 ± 2.9 | 713.4 | 725.3 | 7.70 ± 0.06 |
-
-### Kube-prometheus manifests
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local kp =
- (import 'kube-prometheus/main.libsonnet') +
- // Uncomment the following imports to enable its patches
- // (import 'kube-prometheus/addons/anti-affinity.libsonnet') +
- // (import 'kube-prometheus/addons/managed-cluster.libsonnet') +
- // (import 'kube-prometheus/addons/node-ports.libsonnet') +
- // (import 'kube-prometheus/addons/static-etcd.libsonnet') +
- // (import 'kube-prometheus/addons/custom-metrics.libsonnet') +
- // (import 'kube-prometheus/addons/external-metrics.libsonnet') +
- // (import 'kube-prometheus/addons/pyrra.libsonnet') +
- {
- values+:: {
- common+: {
- namespace: 'monitoring',
- },
- },
- };
-
-{ 'setup/0namespace-namespace': kp.kubePrometheus.namespace } +
-{
- ['setup/prometheus-operator-' + name]: kp.prometheusOperator[name]
- for name in std.filter((function(name) name != 'serviceMonitor' && name != 'prometheusRule'), std.objectFields(kp.prometheusOperator))
-} +
-// { 'setup/pyrra-slo-CustomResourceDefinition': kp.pyrra.crd } +
-// serviceMonitor and prometheusRule are separated so that they can be created after the CRDs are ready
-{ 'prometheus-operator-serviceMonitor': kp.prometheusOperator.serviceMonitor } +
-{ 'prometheus-operator-prometheusRule': kp.prometheusOperator.prometheusRule } +
-{ 'kube-prometheus-prometheusRule': kp.kubePrometheus.prometheusRule } +
-{ ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
-{ ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
-{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
-// { ['pyrra-' + name]: kp.pyrra[name] for name in std.objectFields(kp.pyrra) if name != 'crd' } +
-{ ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
-{ ['kubernetes-' + name]: kp.kubernetesControlPlane[name] for name in std.objectFields(kp.kubernetesControlPlane) }
-{ ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
-{ ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
-{ ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) }
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 129.4 ± 1.4 | 127.7 | 132.8 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 197.0 ± 1.9 | 193.6 | 200.7 | 1.52 ± 0.02 |
-| `Go` | 2127.7 ± 13.8 | 2105.4 | 2151.5 | 16.44 ± 0.21 |
-| `Scala` | 947.9 ± 11.1 | 926.1 | 967.9 | 7.33 ± 0.12 |
-| `C++` | 87633.8 ± 569.9 | 86464.2 | 89118.8 | 677.29 ± 8.72 |
-
-## Benchmarks from C++ jsonnet (/perf_tests)
-
-### Large string join
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- text: std.join(',', std.makeArray(76846, function(_) 'x')),
-}
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 5.6 ± 0.1 | 5.4 | 6.2 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 45.3 ± 0.9 | 43.5 | 47.8 | 8.04 ± 0.25 |
-| `Go` | 98.2 ± 1.6 | 95.0 | 100.8 | 17.45 ± 0.50 |
-| `Scala` | 331.1 ± 5.8 | 322.3 | 343.7 | 58.79 ± 1.73 |
-| `C++` | 76.5 ± 0.7 | 75.4 | 78.0 | 13.59 ± 0.34 |
-
-### Large string template
-
-> Note: No results for Go, fails with os stack size exhausion
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 6.7 ± 0.1 | 6.4 | 7.1 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 7.1 ± 0.2 | 6.8 | 7.6 | 1.05 ± 0.03 |
-| `Scala` | 392.7 ± 2.7 | 388.2 | 399.8 | 58.29 ± 1.19 |
-| `C++` | 14376.2 ± 35.8 | 14317.5 | 14448.6 | 2133.86 ± 41.53 |
-
-### Realistic 1
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local utils = {
- Func3(aaaaaaa, bbbbbbb, cccc)::
- 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/%s/XXXXX/%s/XXXXXXXXXXXXXXX/%s'
- % [aaaaaaa, bbbbbbb, cccc],
-};
-
-
-local long_list = [
- '001xxxxxxxxxxxxxxx-xxx',
- '002xxxxxxxxxxxxxxxxxx-xxx',
- '003xxxxxxxxxxxxxxxx-xxxxxxx',
- '004xxxxxx-xxxxxx',
- '005xxxx-xxx-xxxx',
- '006xxx-xxx-xxxxxx',
- '007xxx-xxx-xxxx-xxxx',
- '008xxx-xxx-xxxx-xxxx-xxxxxxx',
- '009xxx-xxx-xxxxx-xxxx-xxxxxxx-xxxxxx',
- '010xxx-xxx-xxxx-xxxxxxx-xxxxxx-xxxxxxx',
- '011xxx-xxx-xxxxx-xxxxxxxx-xxxxxxx',
- '012xxx-xxx-xxxx-xxxxxxxx-xxxxxxx-xxxxxx',
- '013xxx-xxx-xxxx-xxxxxxxxxx',
- '014xxx-xxx-xxxxx-xxxxxx-xx',
- '015xxx-xxx-xxxxxx-xxxxxxx',
- '016xxx-xxx-xxxx-xxxxxxxx-xxxxx',
- '017xxx-xxx-xxxx-xxxxxxxxxxxxxxx',
- '018xxx-xxx-xxxx-xxxxxxxx-xxxxxxx-xxxxxxx',
- '019xxx-xxx-xxxx-xxxxxxxx-xx',
- '020xxx-xxx-xxxx-xxxxxxxxxxxxxxxx',
- '021xxx-xxx-xxxx-xxxxxxxx-xxxxxxxxxxxx-xxx',
- '022xxx-xxxx-xxxx-xxxx-xxxxxxx',
- '023xxx-xxxx-xxxx-xxx-xxxxxxx-xxxxxx-xxxxxxx',
- '024xxx-xxx-xxxx-xxx-xxxx-xxxx-xxx-xxxxxxxxx',
- '025xxx-xxxx-xxxx-xxxxxxxxx',
- '026xxx-xxx-xxxx-xxx-xxxxxxx',
- '027xxx-xxx-xxxx-xxx-xxxxxxx',
- '028xxx-xxx-xxxx-xxxxxxxxxx',
- '029xxx-xxx-xxxx-xxxxxx',
- '030xxx-xxx-xxxx-xxx-xxxxxxx',
- '031xxx-xxx-xxxx-xxx-xxxxxxxx',
- '032xxx-xxx-xxxxx-xxxxxxxxxxxx-xxxxxxx',
- '033xxx-xxx-xxxx-xxx-xxxx-xxxx',
- '034xxx-xxx-xxxx-xxx-xxxxxxxx-xxxxxxxx',
- '035xxx-xxx-xxxx-xxxxxxx',
- '036xxx-xxx-xxxx-xxxxxxxx-xxxxxxx',
- '037xxx-xxx-xxxx-xxxxxx',
- '038xxx-xxx-xxxx-xxxxxxxxxx',
- '039xxxx-xxx-xxxx-xxxxxx-xxxxxx-xxxxxxx',
- '040xxx-xxx-xxxx-xxxxxx-xxxxxxx',
- '041xxxx-xxx-xxxx-xxxxxx-xx',
- '042xxx-xxx-xxxx-xxxxxxxxxxx',
- '043xxx-xxx-xxxx-xxxxxxxxxxx-xxxxxxx',
- '044xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxx',
- '045xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxx',
- '046xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxx',
- '047xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxxxxxx',
- '048xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxxxxxxx',
- '049xxx-xxx-xxxx-xxxxxx-xxx-xxxxxx-xxxxxxxxx',
- '050xxx-xxx-xxxxx-xxxxx-xxxxxxx',
- '051xxx-xxx-xxxx-xxxxx-xxxxxxxx-xxxxxx',
- '052xxx-xxx-xxxx-xxxxx-xx',
- '053xxx-xxx-xxxx-xxxx-xxxxxxx-xxx-xxxxxxx',
- '054xxx-xxx-xxxx-xxxx-xxxxxxx-xxx-xxxxxx',
- '055xxx-xxx-xxxx-xxx',
- '056xxx-xxx-xxxx-xxxxxxx-xxxxxxx',
- '057xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxxx',
- '058xxx-xxx-xxxx-xxxxxxxxx-xxxxxx-xxxxxxx',
- '059xxx-xxx-xxxx-xx-xxxxxxxxxxx-xxxxx',
- '060xxx-xxx-xxxx-xxxxxxxxxxxxxx-xxxxxxx',
- '061xxx-xxx-xxxx-xxxxxxxx-xxxxxxx',
- '062xxx-xxx-xxxx-xxxxxxxxxxxxx-xxxxxxx',
- '063xxx-xxx-xxxx-xxxxxx-xxxxxxx',
- '064xxx-xxx-xxxxx-xxxxxx-xxxxxxx',
- '065xxx-xxx-xxxx-xxxxx-xxxxx',
- '066xxx-xxx-xxxx-xxxxx-xxxx',
- '067xxx-xxx-xxxx-xxxxxxxxxxxxxxxxx',
- '068xxx-xxx-xxxx-xxxxxxxx-xxxxx-xxx',
- '069xxx-xxx-xxxx-xxxxxxxx-xx-xxx-xxxxxxxx',
- '070xxx-xxx-xxxx-xxxxxxxx-xxxxxx-xxxxxxx',
- '071xxx-xxx-xxxx-xxxxxxxxxx',
- '072xxx-xxxx-xxxx-xxxxxxxxxxxxxxxx',
- '073xxx-xxx-xxxx-xxxxxx-xxxxxx-xxxxxxx',
- '074xxx-xxx-xxxx-xxxxxxx-xxxxxxxxxxxxx',
- '075xxx-xxx-xxxx-xxxxxxx-xxxxxxxxxxxxx-xxxxxxxxx',
- '076xxx-xxx-xxxx-xxxxxxxxxxxxx-xxxxxxx',
- '077xxx-xxx-xxxx-xxxxxxxxx-xxxxxxx-x2',
- '078xxx-xxx-xxxx-xxx',
- '079xxx-xxx-xxxx-xxxxxxxxxxxx',
- '080xxx-xxx-xxxx-xxxxxxxxx-xxxxxxxx',
- '081xxx-xxx-xxxx-xxxxxxxx-xxxxxxxxx',
- '082xxx-xxx-xxxx-xxxxxxxxx',
- '083xxx-xxx-xxxx-xxxxxxx',
- '084xxx-xxx-xxxx-xxxxxxx-xxxxxx',
- '085xxxx-xxx-xxxxxxx-xxxxx-xxxx',
- '086xxx-xxx-xxxxxxxx-xxxx-xxxxxxxxxx',
- '087xxx-xxx-xxxxxxx-xxxxxx-xxxxxxx',
- '088xxx-xxx-xxxxxxx-xxxxxxxx',
- '089xxx-xxx-xxxxxxxx-xxxxxxx',
- '090xxx-xxx-xxxxxxxx-xxxxxxx-xxxxxx',
- '091xxx-xxxx-xxxxxxxxxx',
- '092xxx-xxx-xxxxxx-xx',
- '093xxx-xxx-xxxxxxx',
- '094xxx-xxx-xxxxxxx-xxxxx',
- '095xxx-xxx-xxxxxxxxxx',
- '096xxx-xxx-xxxxxxxxxxxxxxx',
- '098xxx-xxx-xxxxxxxxxxxxxxxxx',
- '098xxx-xxx-xxxxxxxx-xxxxxxx-xxxxxxx',
- '099xxx-xxx-xxxxxxxx-xx',
- '100xxx-xxx-xxxx-xxxxxxxxxxx-xxxxxxx',
- '101xxx-xxxx-xxxxxxxxxxxxxxxx',
- '102xxx-xxx-xxxxxxxxxxxxxxxxxx',
- '103xxx-xxx-xxxxxxxx-xxxxxxxxxxxx-xxx',
- '104xxx-xxx-xxxx-xxxxxxx',
- '105xxx-xxx-xxx-xxxxxxx-xxxxxx-xxxxxxx',
- '106xxx-xxx-xxx-xxxx-xxxx-xxx-xxxxxxxxx',
- '107xxx-xxx-xxxxxxxxx',
- '108xxx-xxx-xxx-xxxxxxx',
- '109xxx-xxx-xxx-xxxxxxx',
- '110xxx-xxxx-xxxxx',
- '111xxx-xxx-xxx-xxxx-xxxx',
- '112xxx-xxx-xxx-xxxxxxx',
- '113xxx-xxx-xxx-xxxxxxx',
- '114xxx-xxx-xxxxxxxxxxxx-xxxxxxx',
- '115xxx-xxx-xxx-xxxx-xxxx',
- '116xxx-xxx-xxx-xxxxxxxx-xxxxxxxx',
- '117xxx-xxx-xxxxxxx',
- '118xxx-xxx-xxxxxxxx-xxxxxxx',
- '119xxx-xxx-xxxxxx',
- '120xxxx-xxx-xxxxxxxxxx',
- '121xxx-xxx-xxxxxx-xxxxxx-xxxxxxx',
- '122xxx-xxx-xxxxxx-xxxxxxx',
- '123xxx-xxx-xxxxxx-xx',
- '124xxxx-xxx-xxx-xxxx-xxxxxxx',
- '125xxx-xxx-xxxxxxxxxxx',
- '126xxx-xxx-xxxxxxxxxxx-xxxxxxx',
- '127xxx-xxx-xxxxxx-xxx-xxxxxx',
- '128xxx-xxx-xxxxxxxxxx',
- '129xxx-xxx-xxxxxxxxxx-xxx',
- '130xxx-xxx-xxxxx-xxxxxxx',
- '131xxx-xxx-xxxxxx-xxxxxxxx-xxx',
- '132xxx-xxx-xxxxx-xxxxxxxx-xxxxxx',
- '133xxx-xxx-xxxxx-xx',
- '134xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxxx',
- '135xxx-xxx-xxxx-xxxxxxx-xxx-xxxxxx',
- '136xxx-xxx-xxxxxxxxxxxxxxx',
- '137xxx-xxx-xxx',
- '138xxx-xxx-xxxxxxx-xxxxxxx',
- '139xxx-xxx-xxxxxxx-xxx-xxxxxxx',
- '140xxx-xxx-xxxxxxxxx-xxxxxx-xxxxxxx',
- '141xxx-xxx-xxxxxxxxxx-xxxx-xxxxxxx',
- '142xxx-xxx-xx-xxxxxxxxxx-xxxxx',
- '143xxx-xxx-xxxxxxxxxxxxxx-xxxxxxx',
- '144xxx-xxx-xxxxxxxxxxxxxxxxx',
- '145xxx-xxx-xxxxxxxx-xxxxxxx',
- '146xxx-xxx-xxxxxxxxxxxxx-xxxxxxx',
- '147xxx-xxx-xxxxxxx-xxxxxxx',
- '148xxx-xxx-xxxxxx-xxxxxxx',
- '149xxx-xxx-xxxxx-xxxxx',
- '150xxx-xxx-xxxxx-xxxx',
- '151xxx-xxx-xxxxxxxxxxxxxxxxx',
- '152xxx-xxx-xxxxxxxxxxxxxxxxxxx',
- '153xxx-xxx-xxxxxxxxx-xxxxx-xxx',
- '154xxx-xxx-xxxxxxxx-xxxxx-xxxx-xxxx',
- '155xxx-xxx-xxxxxxxx-xxxxxxxxxxxx-xxxx',
- '156xxx-xxx-xxxxxxxx-xx-xxx-xxxxxxxx',
- '157xxx-xxx-xxxxxxxx-xxxxxx-xxxxxxx',
- '158xxx-xxx-xxxxxxxxxx',
- '159xxx-xxx-xxxx-xxxxxx',
- '160xxx-xxx-xxxxxxxxxx',
- '161xxx-xxx-xxxxxxxxxxxxx',
- '162xxx-xxx-xxxxxxxxxxxxxxxx',
- '163xxx-xxx-xxxxx-xxxxxx-xxxxxxx',
- '164xxx-xxx-xxxxxxx-xxxxxxxxxxxxx',
- '165xxx-xxx-xxxxxxxxxxxxxx-xxxxxxx',
- '166xxx-xxx-xxxxxxxxx-xxxxxxx-x2',
- '167xxx-xxx-xxx',
- '168xxx-xxx-xxxxxxxxxxxx',
- '169xxx-xxx-xxxxxxxxx-xxxxxxxx',
- '170xxx-xxx-xxxxxxxxx-xxx-xxxxxxx',
- '171xxx-xxx-xxxxxxxxx',
- '172xxx-xxxx-xxxxxxxxx',
- '173xxx-xxx',
- '174xxx-xxxxxx-xxxxxxx',
- '175xxx-xxxxxx-xxxxxx-xxxx',
- '176xxx-xxxxxx-xxxxx',
- '177xxx-xxxxx-xxxxxxxx',
- '178xxx-xxxxxx',
- '179xxx-xxxxxxx-xxxx',
- '180xxx-xxxxxxx-xxxx-xxxx',
- '181xxx-xxxxxxx-xxxx-xxxxxxx',
- '182xxx-xxxxxxx-xxxx-xxxxxxxxxxxxxxx',
- '183xxx-xxxxxxxx-xxxx-xxxxx',
- '184xxx-xxxxxxx-xxxx-xxxxxxx',
- '185xxx-xxxxxxx-xxxx-xxxxxxxx-xxxxxxx',
- '186xxx-xxxxxxx-xxxx-xxx',
- '187xxx-xxxxxxx-xxxx-xxxxxxx-xxx-xxxxxxx',
- '188xxx-xxxxxxx-xxxx-xxxxxxxxxxxxxx-xxxxxxx',
- '189xxx-xxxxxxxx-xxxx-xxxxxxxxxxxxxxxxx',
- '190xxx-xxxxxxx-xxxx-xxxxx-xxxxxx-xxxxxxx',
- '191xxx-xxxxxxx-xxxxxxxxxx',
- '192xxx-xxxxxxx-xxxxxxx',
- '193xxx-xxxxxxx-xxxxxxxxxxxxxxx',
- '194xxx-xxxxxxx-xxxxx',
- '195xxx-xxxxxxx-xxxxxxx',
- '196xxx-xxxxxxx-xxxxxxxx-xxxxxxx',
- '197xxx-xxxxxxx-xxx',
- '198xxx-xxxxxxx-xxxxxxx-xxx-xxxxxxx',
- '199xxx-xxxxxxx-xxxxxxxxxxxxxx-xxxxxxx',
- '200xxx-xxxxxxxx-xxxxxxxxxxxxxxxxx',
- '201xxx-xxxxxxx-xxxxx-xxxxxx-xxxxxxx',
- '202xxx-xxx',
- '203xxx-xxx-xxxxxx',
- '204xxxxxxxxx-xxx',
- '205xxxxxxxxxxx-xxx',
- '206xxxxxxxxx-xxxxxxx',
- '207xxxx-xxxxxx-xxxxxxxxxxx-xxxxx1',
- '208xxxx-xxxxxxxx-xxxxxxxx-xxxxx1',
- '209xxxx-xxxxxxx-xxxxxxx-xxxxx1',
- '209xxxx-xxxxxxx-xxxxxxx-xxxxx2',
- '210xxxx-xxxx-xxxxxxx-xxxxx1',
- '211xxxx-xxxxx-xxxxxxxx1-xxxxx1',
- '212xxxx-xxxx-xxxxxxxx2-xxxxx1',
- '213xxxx-xxxx-xxxxxxx1-xxxxx1',
- '214xxxx-xxxx-xxxxxxx2-xxxxx1',
- '215xxxxxxxxx-xxxxxx',
- '216xxxxxxxxx-xxxxxxx',
- '217xxxxxxxxx-xxxx',
-];
-
-{
- 'yyyyyyyyy': {
- local Func3(z, n) = utils.Func3('yyyyyyyyy', z, n),
-
- global: {
- [n]: {
- members: [
- Func3(z, '%s-gggg-%s-%s' % [n, z, suffix]),
- for z in ['ooooooo-a', 'ooooooo-b', 'ooooooo-c',
- 'ooooooo-a', 'ooooooo-b', 'ooooooo-c']
- for suffix in ['a', 'b', 'c']
- ],
- }
- for n in long_list
- },
- },
-}
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 12.6 ± 0.1 | 12.3 | 12.9 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 49.7 ± 1.0 | 47.3 | 53.0 | 3.96 ± 0.09 |
-| `Go` | 6858.1 ± 34.9 | 6815.9 | 6951.8 | 546.32 ± 6.87 |
-| `Scala` | 382.3 ± 3.9 | 371.7 | 387.1 | 30.46 ± 0.47 |
-| `C++` | 24472.7 ± 155.7 | 24230.3 | 24799.3 | 1949.51 ± 25.63 |
-
-### Realistic 2
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local rfc3339(timestamp) = '1970-01-01T00:00:00Z';
-
-local name1(a, b, c) =
- 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%sBBBBBBB%sCCCCCCCCCCC%s'
- % [a, b, c];
-
-local name2(x) =
- 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%s' % x;
-
-local T1 = 'PPPPPPPPPPPPPPPPPPPPPPP';
-local T2 = 'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ';
-
-local LOCATIONS = [
- 'europe-west1-b',
- 'europe-west1-c',
- 'europe-west1-d',
- 'europe-west2-a',
- 'europe-west2-b',
- 'europe-west2-c',
- 'europe-west3-a',
- 'europe-west3-b',
- 'europe-west3-c',
- 'europe-west4-a',
- 'europe-west4-b',
- 'europe-west4-c',
- 'us-central1-a',
- 'us-central1-b',
- 'us-central1-c',
- 'us-central1-f',
- 'us-east1-b',
- 'us-east1-c',
- 'us-east1-d',
- 'us-east4-a',
- 'us-east4-b',
- 'us-east4-c',
- 'us-west1-a',
- 'us-west1-b',
- 'us-west1-c',
-];
-
-
-// The return value is a function to allow it to be parameterized.
-function(
- timestamp=0,
- x='xxxxxxxxxxxxxxxxxxx',
- prefix='prefix',
- num1=50,
- count=25,
- offset=0,
-)
- local rfc_timestamp = rfc3339(timestamp);
-
- local func1(i) =
- local location = LOCATIONS[i % std.length(LOCATIONS)];
- [
- local name = '%s-%000d-%000d' % [prefix, i, j];
- {
- field_zz1: rfc_timestamp,
- fie_z2: {
- field_z3: name1(x, location, name),
- field_zzzzzzzzzz4: name2(x),
- field_zzz5: [name],
- field_z6: T1,
- field_z7: location,
- fi_8: '???',
- fiel_z9: '99',
- },
- }
- for j in std.range(0, num1 - 1)
- ];
-
- local func2(i) =
- local location = LOCATIONS[i % std.length(LOCATIONS)];
- local all = [
- name1(x, location, '%s-%000d-%000d' % [prefix, i, j])
- for j in std.range(0, num1 - 1)
- ];
- [
- {
- field_yy1: rfc_timestamp,
- field_yyyyy2: 'EEEE',
- field_yyyyy3: {
- field_y4: T2,
- field_yyyyyyy5: p,
- field_yyyyyyy6: q,
- },
- }
- for p in all
- for q in all
- if p != q
- ];
-
-
- {
- field_x1: '-----',
- field_xxxxxxxxxxxxxxxx2: std.join([], [
- func1(offset * count + i)
- for i in std.range(0, count - 1)
- ]),
- field_xxxxxxxxxxxxxxxxxxxxxx3: std.join([], [
- func2(offset * count + i)
- for i in std.range(0, count - 1)
- ]),
- }
-
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 259.9 ± 4.4 | 250.9 | 266.7 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 550.2 ± 16.6 | 531.9 | 600.7 | 2.12 ± 0.07 |
-| `Go` | 6732.4 ± 51.4 | 6660.2 | 6858.6 | 25.90 ± 0.48 |
-| `Scala` | 675.4 ± 10.9 | 667.3 | 720.0 | 2.60 ± 0.06 |
-| `C++` | 26414.5 ± 259.9 | 25948.9 | 26934.4 | 101.63 ± 1.99 |
-
-## Benchmarks from C++ jsonnet (/benchmarks)
-
-### Tail call
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-/*
-Copyright 2015 Google Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-local sum(x) =
- if x == 0 then
- 0
- else
- x + sum(x - 1);
-sum(300)
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 1.8 ± 0.1 | 1.6 | 2.6 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 3.1 ± 0.1 | 2.8 | 3.4 | 1.69 ± 0.12 |
-| `Go` | 5.3 ± 0.2 | 4.9 | 5.9 | 2.90 ± 0.20 |
-| `Scala` | 287.4 ± 1.2 | 285.4 | 288.9 | 156.55 ± 9.92 |
-| `C++` | 32.1 ± 0.3 | 31.6 | 33.0 | 17.49 ± 1.12 |
-
-### Inheritance recursion
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-/*
-Copyright 2015 Google Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-local Fib = {
- n: 1,
- local outer = self,
- r: if self.n <= 1 then 1 else (Fib { n: outer.n - 1 }).r + (Fib { n: outer.n - 2 }).r,
-};
-
-(Fib { n: 25 }).r
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 376.1 ± 5.2 | 364.3 | 383.7 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 496.7 ± 13.0 | 470.6 | 506.8 | 1.32 ± 0.04 |
-| `Go` | 873.9 ± 7.1 | 859.3 | 888.0 | 2.32 ± 0.04 |
-| `Scala` | 420.8 ± 6.3 | 413.9 | 437.1 | 1.12 ± 0.02 |
-| `C++` | 2647.5 ± 14.2 | 2630.9 | 2675.6 | 7.04 ± 0.10 |
-
-### Simple recursive call
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-/*
-Copyright 2015 Google Inc. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-local fibonacci(n) =
- if n <= 1 then
- 1
- else
- fibonacci(n - 1) + fibonacci(n - 2);
-
-fibonacci(25)
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 81.3 ± 0.3 | 80.9 | 82.4 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 202.3 ± 12.0 | 183.1 | 237.6 | 2.49 ± 0.15 |
-| `Go` | 349.4 ± 1.7 | 347.2 | 354.2 | 4.30 ± 0.03 |
-| `Scala` | 322.5 ± 3.0 | 318.7 | 330.7 | 3.97 ± 0.04 |
-| `C++` | 193.5 ± 0.9 | 191.4 | 194.8 | 2.38 ± 0.01 |
-
-### Foldl string concat
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-std.foldl(function(e, res) e + res, std.makeArray(20000, function(i) 'aaaaa'), '')
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 8.9 ± 0.1 | 8.6 | 9.3 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 303.1 ± 3.8 | 297.6 | 308.1 | 34.06 ± 0.68 |
-| `Go` | 50.9 ± 0.8 | 48.3 | 52.2 | 5.72 ± 0.13 |
-| `Scala` | 550.6 ± 5.5 | 542.8 | 563.7 | 61.86 ± 1.13 |
-| `C++` | 902.6 ± 4.8 | 891.4 | 912.1 | 101.41 ± 1.65 |
-
-### Array sorts
-
-> Note: No results for Scala, sjsonnet doesn't support keyF in std.sort: https://github.com/databricks/sjsonnet/issues/204
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-// A benchmark for builtin sort
-
-local reverse = std.reverse;
-local sort = std.sort;
-
-true
-&& std.assertEqual(std.range(1, 500), sort(std.range(1, 500)))
-&& std.assertEqual(std.range(1, 1000), sort(std.range(1, 1000)))
-&& std.assertEqual(reverse(std.range(1, 1000)), sort(std.range(1, 1000), keyF=function(x) -x))
-&& std.assertEqual(std.range(1, 1000), sort(reverse(std.range(1, 1000))))
-&& std.assertEqual(std.makeArray(2000, function(i) std.floor((i + 2) / 2)), sort(std.range(1, 1000) + reverse(std.range(1, 1000))))
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 3.2 ± 0.2 | 2.9 | 4.1 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 14.4 ± 0.6 | 13.1 | 16.2 | 4.46 ± 0.28 |
-| `Go` | 12.1 ± 0.2 | 11.4 | 12.8 | 3.74 ± 0.20 |
-| `C++` | 3637.1 ± 24.9 | 3557.4 | 3664.7 | 1128.64 ± 56.81 |
-
-### Lazy array
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local f2(f) = function(x) f(f(x));
-local id(x) = x;
-
-local slowId = std.makeArray(20, function(i) if i == 0 then id else f2(slowId[i - 1]));
-
-slowId[15](42)
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 54.1 ± 1.1 | 52.3 | 56.3 | 1.30 ± 0.03 |
-| `Rust (alternative, rsjsonnet)` | 41.7 ± 0.7 | 39.6 | 43.8 | 1.00 |
-| `Go` | 596.5 ± 5.2 | 585.1 | 606.9 | 14.30 ± 0.29 |
-| `Scala` | 306.6 ± 1.6 | 303.5 | 310.4 | 7.35 ± 0.14 |
-| `C++` | 184.5 ± 1.8 | 182.0 | 187.9 | 4.42 ± 0.09 |
-
-### Inheritance function recursion
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local fibnext = {
- a: super.a + super.b,
- b: super.a,
-};
-local fib(n) =
- if n == 0 then
- { a: 1, b: 1 }
- else
- fib(n - 1) + fibnext;
-
-fib(25)
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 1.6 ± 0.1 | 1.5 | 2.5 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 2.9 ± 0.1 | 2.7 | 3.7 | 1.78 ± 0.13 |
-| `Go` | 2.4 ± 0.1 | 2.1 | 2.9 | 1.48 ± 0.12 |
-| `Scala` | 293.2 ± 1.5 | 289.9 | 296.1 | 178.20 ± 12.35 |
-| `C++` | 999.1 ± 9.2 | 974.4 | 1010.9 | 607.23 ± 42.34 |
-
-### String strips
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-// This string must be longer than max stack frames
-local veryLongString = std.join('', std.repeat(['e'], 510));
-
-std.assertEqual(std.stripChars(veryLongString + 'ok' + veryLongString, 'e'), 'ok') &&
-std.assertEqual(std.lstripChars(veryLongString + 'ok', 'e'), 'ok') &&
-std.assertEqual(std.rstripChars('ok' + veryLongString, 'e'), 'ok') &&
-
-true
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 8.6 ± 0.2 | 8.4 | 9.5 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 18.4 ± 0.4 | 17.6 | 20.8 | 2.13 ± 0.06 |
-| `Go` | 11.2 ± 0.2 | 10.4 | 11.9 | 1.29 ± 0.04 |
-| `Scala` | 294.9 ± 2.0 | 292.2 | 301.9 | 34.10 ± 0.65 |
-| `C++` | 37345.3 ± 208.2 | 36567.2 | 37689.0 | 4318.10 ± 80.13 |
-
-### Big object
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-// Generator source
-local n = 2000;
-
-local objLocal(name, body) = 'local ' + name + ' = ' + body + ',';
-local objField(name, body) = name + ': ' + body + ',';
-
-local allLocals =
- std.makeArray(n, function(i) objLocal('l' + i, '1'));
-
-local allFields =
- std.makeArray(n, function(i) objField('f' + i, '2'));
-
-local indent = ' ';
-local indentAndSeparate(s) = indent + s + '\n';
-
-local objContents = std.map(indentAndSeparate, allLocals + allFields);
-
-local objectBody = std.join('', objContents);
-'{\n' + objectBody + '}\n'
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 2.2 ± 0.1 | 1.9 | 3.0 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 3.2 ± 0.1 | 2.9 | 3.5 | 1.46 ± 0.10 |
-| `Go` | 4.1 ± 0.1 | 3.7 | 4.6 | 1.85 ± 0.13 |
-| `Scala` | 292.3 ± 2.9 | 289.3 | 304.0 | 132.11 ± 8.64 |
-| `C++` | 28.3 ± 0.3 | 27.7 | 29.1 | 12.80 ± 0.84 |
-
-## Benchmarks from Go jsonnet (builtins)
-
-### std.base64
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.base64("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus.") for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 2.7 ± 0.1 | 2.4 | 3.4 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 2195.9 ± 48.5 | 2098.1 | 2229.6 | 804.07 ± 39.58 |
-| `Go` | 17.0 ± 0.3 | 16.1 | 17.7 | 6.22 ± 0.29 |
-| `Scala` | 313.8 ± 1.2 | 311.3 | 316.1 | 114.91 ± 5.07 |
-| `C++` | 14621.6 ± 110.0 | 14473.9 | 14774.9 | 5354.05 ± 238.94 |
-
-### std.base64Decode
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.base64Decode("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4=") for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 2.6 ± 0.1 | 2.3 | 3.1 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 7889.2 ± 74.7 | 7711.6 | 8051.1 | 3045.22 ± 138.95 |
-| `Go` | 15.2 ± 0.3 | 14.6 | 16.5 | 5.85 ± 0.28 |
-| `Scala` | 313.0 ± 2.5 | 309.5 | 321.2 | 120.80 ± 5.47 |
-| `C++` | 9930.9 ± 26.5 | 9895.0 | 9997.9 | 3833.33 ± 171.41 |
-
-### std.base64DecodeBytes
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.base64DecodeBytes("TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFNlZCB0dXJwaXMgdGluY2lkdW50IGlkIGFsaXF1ZXQgcmlzdXMuIEVnZXQgbWF1cmlzIHBoYXJldHJhIGV0IHVsdHJpY2VzIG5lcXVlIG9ybmFyZSBhZW5lYW4gZXVpc21vZC4gRGlhbSBxdWlzIGVuaW0gbG9ib3J0aXMgc2NlbGVyaXNxdWUgZmVybWVudHVtLiBWYXJpdXMgZHVpcyBhdCBjb25zZWN0ZXR1ciBsb3JlbSBkb25lYyBtYXNzYSBzYXBpZW4uIERpYW0gc2l0IGFtZXQgbmlzbCBzdXNjaXBpdCBhZGlwaXNjaW5nIGJpYmVuZHVtIGVzdCB1bHRyaWNpZXMgaW50ZWdlci4gTGVjdHVzIHVybmEgZHVpcyBjb252YWxsaXMgY29udmFsbGlzIHRlbGx1cy4gTmliaCBpcHN1bSBjb25zZXF1YXQgbmlzbCB2ZWwgcHJldGl1bSBsZWN0dXMgcXVhbSBpZCBsZW8uIEZldWdpYXQgaW4gYW50ZSBtZXR1cyBkaWN0dW0gYXQgdGVtcG9yIGNvbW1vZG8uIFZlbGl0IGRpZ25pc3NpbSBzb2RhbGVzIHV0IGV1IHNlbSBpbnRlZ2VyLiBEaWN0dW0gc2l0IGFtZXQganVzdG8gZG9uZWMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gU2VkIHR1cnBpcyB0aW5jaWR1bnQgaWQgYWxpcXVldCByaXN1cy4gRWdldCBtYXVyaXMgcGhhcmV0cmEgZXQgdWx0cmljZXMgbmVxdWUgb3JuYXJlIGFlbmVhbiBldWlzbW9kLiBEaWFtIHF1aXMgZW5pbSBsb2JvcnRpcyBzY2VsZXJpc3F1ZSBmZXJtZW50dW0uIFZhcml1cyBkdWlzIGF0IGNvbnNlY3RldHVyIGxvcmVtIGRvbmVjIG1hc3NhIHNhcGllbi4gRGlhbSBzaXQgYW1ldCBuaXNsIHN1c2NpcGl0IGFkaXBpc2NpbmcgYmliZW5kdW0gZXN0IHVsdHJpY2llcyBpbnRlZ2VyLiBMZWN0dXMgdXJuYSBkdWlzIGNvbnZhbGxpcyBjb252YWxsaXMgdGVsbHVzLiBOaWJoIGlwc3VtIGNvbnNlcXVhdCBuaXNsIHZlbCBwcmV0aXVtIGxlY3R1cyBxdWFtIGlkIGxlby4gRmV1Z2lhdCBpbiBhbnRlIG1ldHVzIGRpY3R1bSBhdCB0ZW1wb3IgY29tbW9kby4gVmVsaXQgZGlnbmlzc2ltIHNvZGFsZXMgdXQgZXUgc2VtIGludGVnZXIuIERpY3R1bSBzaXQgYW1ldCBqdXN0byBkb25lYy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4gU2NlbGVyaXNxdWUgbWF1cmlzIHBlbGxlbnRlc3F1ZSBwdWx2aW5hciBwZWxsZW50ZXNxdWUgaGFiaXRhbnQgbW9yYmkgdHJpc3RpcXVlIHNlbmVjdHVzLiBTY2VsZXJpc3F1ZSBtYXVyaXMgcGVsbGVudGVzcXVlIHB1bHZpbmFyIHBlbGxlbnRlc3F1ZSBoYWJpdGFudCBtb3JiaSB0cmlzdGlxdWUgc2VuZWN0dXMuIFNjZWxlcmlzcXVlIG1hdXJpcyBwZWxsZW50ZXNxdWUgcHVsdmluYXIgcGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cy4=") for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 34.8 ± 0.5 | 33.4 | 36.0 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 8116.2 ± 37.2 | 8049.1 | 8176.2 | 233.52 ± 3.24 |
-| `Go` | 271.1 ± 2.3 | 267.1 | 275.7 | 7.80 ± 0.12 |
-| `Scala` | 357.2 ± 2.3 | 353.5 | 363.4 | 10.28 ± 0.15 |
-| `C++` | 9653.7 ± 22.5 | 9621.4 | 9694.3 | 277.75 ± 3.69 |
-
-### std.base64 (byte array)
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.base64([76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,76,111,114,101,109,32,105,112,115,117,109,32,100,111,108,111,114,32,115,105,116,32,97,109,101,116,44,32,99,111,110,115,101,99,116,101,116,117,114,32,97,100,105,112,105,115,99,105,110,103,32,101,108,105,116,44,32,115,101,100,32,100,111,32,101,105,117,115,109,111,100,32,116,101,109,112,111,114,32,105,110,99,105,100,105,100,117,110,116,32,117,116,32,108,97,98,111,114,101,32,101,116,32,100,111,108,111,114,101,32,109,97,103,110,97,32,97,108,105,113,117,97,46,32,83,101,100,32,116,117,114,112,105,115,32,116,105,110,99,105,100,117,110,116,32,105,100,32,97,108,105,113,117,101,116,32,114,105,115,117,115,46,32,69,103,101,116,32,109,97,117,114,105,115,32,112,104,97,114,101,116,114,97,32,101,116,32,117,108,116,114,105,99,101,115,32,110,101,113,117,101,32,111,114,110,97,114,101,32,97,101,110,101,97,110,32,101,117,105,115,109,111,100,46,32,68,105,97,109,32,113,117,105,115,32,101,110,105,109,32,108,111,98,111,114,116,105,115,32,115,99,101,108,101,114,105,115,113,117,101,32,102,101,114,109,101,110,116,117,109,46,32,86,97,114,105,117,115,32,100,117,105,115,32,97,116,32,99,111,110,115,101,99,116,101,116,117,114,32,108,111,114,101,109,32,100,111,110,101,99,32,109,97,115,115,97,32,115,97,112,105,101,110,46,32,68,105,97,109,32,115,105,116,32,97,109,101,116,32,110,105,115,108,32,115,117,115,99,105,112,105,116,32,97,100,105,112,105,115,99,105,110,103,32,98,105,98,101,110,100,117,109,32,101,115,116,32,117,108,116,114,105,99,105,101,115,32,105,110,116,101,103,101,114,46,32,76,101,99,116,117,115,32,117,114,110,97,32,100,117,105,115,32,99,111,110,118,97,108,108,105,115,32,99,111,110,118,97,108,108,105,115,32,116,101,108,108,117,115,46,32,78,105,98,104,32,105,112,115,117,109,32,99,111,110,115,101,113,117,97,116,32,110,105,115,108,32,118,101,108,32,112,114,101,116,105,117,109,32,108,101,99,116,117,115,32,113,117,97,109,32,105,100,32,108,101,111,46,32,70,101,117,103,105,97,116,32,105,110,32,97,110,116,101,32,109,101,116,117,115,32,100,105,99,116,117,109,32,97,116,32,116,101,109,112,111,114,32,99,111,109,109,111,100,111,46,32,86,101,108,105,116,32,100,105,103,110,105,115,115,105,109,32,115,111,100,97,108,101,115,32,117,116,32,101,117,32,115,101,109,32,105,110,116,101,103,101,114,46,32,68,105,99,116,117,109,32,115,105,116,32,97,109,101,116,32,106,117,115,116,111,32,100,111,110,101,99,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115,46,32,83,99,101,108,101,114,105,115,113,117,101,32,109,97,117,114,105,115,32,112,101,108,108,101,110,116,101,115,113,117,101,32,112,117,108,118,105,110,97,114,32,112,101,108,108,101,110,116,101,115,113,117,101,32,104,97,98,105,116,97,110,116,32,109,111,114,98,105,32,116,114,105,115,116,105,113,117,101,32,115,101,110,101,99,116,117,115]),for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 30.3 ± 0.4 | 29.1 | 31.6 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 1460.8 ± 47.6 | 1375.2 | 1568.3 | 48.26 ± 1.72 |
-| `Go` | 156.5 ± 1.9 | 152.5 | 159.4 | 5.17 ± 0.10 |
-| `Scala` | 355.9 ± 2.9 | 351.4 | 365.6 | 11.76 ± 0.20 |
-| `C++` | 13362.4 ± 88.3 | 13028.4 | 13473.8 | 441.41 ± 7.01 |
-
-### std.foldl
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local input = std.makeArray(10000, function(i) 'xxxxx');
-
-std.foldl(function(acc, value) acc + value, input, '')
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 5.3 ± 0.2 | 5.0 | 6.2 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 81.5 ± 1.6 | 78.9 | 83.8 | 15.38 ± 0.55 |
-| `Go` | 26.6 ± 0.5 | 25.0 | 27.5 | 5.02 ± 0.18 |
-| `Scala` | 405.4 ± 3.0 | 400.9 | 413.6 | 76.52 ± 2.34 |
-| `C++` | 265.3 ± 2.7 | 260.6 | 271.5 | 50.08 ± 1.57 |
-
-### std.manifestJsonEx
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- bar: {
- prometheusOperator+: {
- service+: {
- spec+: {
- ports: [
- {
- name: 'https',
- port: 8443,
- targetPort: 'https',
- },
- ],
- },
- },
- serviceMonitor+: {
- spec+: {
- endpoints: [
- {
- port: 'https',
- scheme: 'https',
- honorLabels: true,
- bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
- tlsConfig: {
- insecureSkipVerify: true,
- },
- },
- ]
- },
- },
- clusterRole+: {
- rules+: [
- {
- apiGroups: ['authentication.k8s.io'],
- resources: ['tokenreviews'],
- verbs: ['create'],
- },
- {
- apiGroups: ['authorization.k8s.io'],
- resources: ['subjectaccessreviews'],
- verbs: ['create'],
- },
- ],
- },
- }
- },
- foo: std.manifestJsonEx(self.bar, " ")
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 1.7 ± 0.1 | 1.4 | 2.7 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 2.9 ± 0.1 | 2.7 | 3.3 | 1.73 ± 0.13 |
-| `Go` | 3.2 ± 0.1 | 2.7 | 3.8 | 1.92 ± 0.15 |
-| `Scala` | 294.7 ± 1.7 | 291.6 | 299.0 | 175.84 ± 12.30 |
-| `C++` | 101.4 ± 0.8 | 99.3 | 102.9 | 60.48 ± 4.24 |
-
-### std.manifestTomlEx
-
-> Note: No results for Scala, std.manifestTomlEx is not implemented: https://github.com/databricks/sjsonnet/issues/111
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- bar: {
- prometheusOperator+: {
- service+: {
- spec+: {
- ports: [
- {
- name: 'https',
- port: 8443,
- targetPort: 'https',
- },
- ],
- },
- },
- serviceMonitor+: {
- spec+: {
- endpoints: [
- {
- port: 'https',
- scheme: 'https',
- honorLabels: true,
- bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
- tlsConfig: {
- insecureSkipVerify: true,
- },
- },
- ],
- },
- },
- clusterRole+: {
- rules+: [
- {
- apiGroups: ['authentication.k8s.io'],
- resources: ['tokenreviews'],
- verbs: ['create'],
- },
- {
- apiGroups: ['authorization.k8s.io'],
- resources: ['subjectaccessreviews'],
- verbs: ['create'],
- },
- ],
- },
- },
- },
- nothing: std.manifestTomlEx(self.bar, ' '),
-}
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 1.7 ± 0.1 | 1.4 | 2.7 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 7.8 ± 0.2 | 7.3 | 8.5 | 4.65 ± 0.36 |
-| `Go` | 3.2 ± 0.1 | 2.9 | 3.7 | 1.90 ± 0.16 |
-| `C++` | 1046.1 ± 4.9 | 1039.7 | 1053.9 | 622.36 ± 44.25 |
-
-### std.parseInt
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.parseInt("-123949595") for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 1.7 ± 0.1 | 1.4 | 2.6 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 2.9 ± 0.1 | 2.6 | 3.4 | 1.71 ± 0.16 |
-| `Go` | 2.8 ± 0.1 | 2.4 | 3.3 | 1.64 ± 0.16 |
-| `Scala` | 292.7 ± 1.7 | 289.2 | 295.8 | 170.68 ± 14.76 |
-| `C++` | 101.0 ± 0.7 | 99.0 | 102.0 | 58.88 ± 5.10 |
-
-### std.reverse
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.reverse(std.range(0, 5000)) for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 45.3 ± 0.5 | 44.0 | 46.5 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 784.1 ± 20.4 | 741.5 | 802.0 | 17.31 ± 0.49 |
-| `Go` | 327.4 ± 2.1 | 323.8 | 331.4 | 7.23 ± 0.10 |
-| `Scala` | 367.0 ± 2.4 | 361.1 | 370.2 | 8.10 ± 0.11 |
-| `C++` | 659.3 ± 5.4 | 644.6 | 666.0 | 14.55 ± 0.21 |
-
-### std.substr
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-{
- foo: [
- std.substr("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed turpis tincidunt id aliquet risus. Eget mauris pharetra et ultrices neque ornare aenean euismod. Diam quis enim lobortis scelerisque fermentum. Varius duis at consectetur lorem donec massa sapien. Diam sit amet nisl suscipit adipiscing bibendum est ultricies integer. Lectus urna duis convallis convallis tellus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Feugiat in ante metus dictum at tempor commodo. Velit dignissim sodales ut eu sem integer. Dictum sit amet justo donec. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. Scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique senectus. ", i, 800-i) for i in std.range(0,100)
- ],
-}
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 2.2 ± 0.2 | 1.9 | 3.2 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 3.2 ± 0.1 | 3.1 | 3.6 | 1.49 ± 0.11 |
-| `Go` | 6.8 ± 0.2 | 6.3 | 7.4 | 3.12 ± 0.24 |
-| `Scala` | 303.6 ± 3.6 | 300.5 | 318.2 | 139.43 ± 9.76 |
-| `C++` | 29.1 ± 0.4 | 28.3 | 30.2 | 13.36 ± 0.94 |
-
-### Comparsion for array
-
-> Note: No results for Scala, array comparsion is not implemented
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-local long_array = std.range(1, 1000000);
-long_array + [1] < long_array + [2]
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 25.7 ± 0.2 | 25.0 | 26.0 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 228.1 ± 7.9 | 214.0 | 245.1 | 8.89 ± 0.31 |
-| `Go` | 150.4 ± 10.4 | 135.9 | 169.4 | 5.86 ± 0.41 |
-| `C++` | 125755.8 ± 989.6 | 123095.8 | 127475.4 | 4901.85 ± 49.12 |
-
-### Comparsion for primitives
-
-> Note: No results for C++, can't run: uses up to 192GB of RAM
-
-<details>
-<summary>Source</summary>
-
-```jsonnet
-([ i < j for i in std.range(1, 1000) for j in std.range(1, 1000)])
-
-```
-</details>
-
-| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
-|:---|---:|---:|---:|---:|
-| `Rust` | 385.9 ± 4.2 | 372.4 | 391.5 | 1.00 |
-| `Rust (alternative, rsjsonnet)` | 1287.4 ± 27.0 | 1244.2 | 1335.1 | 3.34 ± 0.08 |
-| `Go` | 1817.1 ± 18.6 | 1779.7 | 1842.9 | 4.71 ± 0.07 |
-| `Scala` | 453.1 ± 3.9 | 448.1 | 462.2 | 1.17 ± 0.02 |
nix/benchmarks.adocdiffbeforeafterboth--- /dev/null
+++ b/nix/benchmarks.adoc
@@ -0,0 +1,7 @@
+= Benchmarks
+
+There are multiple implementations of jsonnet implemented in different languages: Rust (this repo), https://github.com/google/go-jsonnet/[Go], https://github.com/databricks/sjsonnet[Scala], https://github.com/google/jsonnet[C++], https://github.com/moleike/haskell-jsonnet[Haskell].
+
+For simplicity, I will call these implementations by the language of their implementation.
+
+Unfortunately, I haven't managed to measure performance of Haskell implementation, because I wasn't able to build it, and there is no binaries published anywhere, so this implementation is omitted from the following benchmarks
nix/benchmarks.mddiffbeforeafterboth--- a/nix/benchmarks.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Benchmarks
-
-There are multiple implementations of jsonnet implemented in different languages: Rust (this repo), [Go](https://github.com/google/go-jsonnet/), [Scala](https://github.com/databricks/sjsonnet), [C++](https://github.com/google/jsonnet), [Haskell](https://github.com/moleike/haskell-jsonnet).
-
-For simplicity, I will call these implementations by the language of their implementation.
-
-Unfortunately, I haven't managed to measure performance of Haskell implementation, because I wasn't able to build it, and there is no binaries published anywhere, so this implementation is omitted from the following benchmarks
nix/benchmarks.nixdiffbeforeafterboth1{2 lib,3 runCommand,4 jsonnet-bundler,5 cacert,6 stdenv,7 fetchFromGitHub,8 go-jsonnet,9 sjsonnet,10 cpp-jsonnet,11 rsjsonnet,12 hyperfine,13 quick ? false,14 jrsonnetVariants,15}:16with lib;17let18 inherit (cpp-jsonnet) jsonnetBench;19 inherit (go-jsonnet) goJsonnetBench;20 graalvmBench = fetchFromGitHub {21 owner = "oracle";22 repo = "graal";23 rev = "bc305df3fe587960f7635f0185571500e5988475";24 hash = "sha256-4EKB1b2o4/qtYQ+nqbbs621OJrtjApsAWEBcw5EjrYc=";25 };26 kubePrometheusBench =27 let28 src = fetchFromGitHub {29 owner = "prometheus-operator";30 repo = "kube-prometheus";31 rev = "d3889807798d1697ea0691f10caf1b6a1997a8bd";32 hash = "sha256-TeYWHzoZAmDp2PzT7EH8XRUcvb3tR8Qfxel7o2QBvIM=";33 };34 in35 runCommand "kube-prometheus-vendor"36 {37 outputHash = "sha256-AGc0dHlD/Ld7I5b1+gOotzJkYrn+bB1VjISdD5NITtw=";38 outputHashMode = "recursive";39 buildInputs = [ cacert ];40 }41 ''42 mkdir -p $out43 cp -r ${src}/* $out/44 cd $out45 chmod u+w jsonnetfile.lock.json46 mkdir vendor47 ${jsonnet-bundler}/bin/jb install48 '';4950 # Removes outsiders from the output51 # Useful when comparing performance of different jrsonnet releases52 skipSlow = if quick then "slow benchmark, but only quick requested" else "";53in54stdenv.mkDerivation {55 name = "benchmarks";56 __impure = true;57 unpackPhase = "true";5859 buildInputs = [60 sjsonnet61 cpp-jsonnet62 rsjsonnet63 go-jsonnet6465 hyperfine66 ];6768 installPhase =69 let70 mkBench =71 {72 name,73 path,74 omitSource ? false,75 pathIsGenerator ? false,76 skipRustAlternative ? "",77 skipScala ? "",78 skipCpp ? "",79 skipGo ? "",80 vendor ? "",81 }:82 ''83 echo >> $out84 echo "### ${name}" >> $out85 echo >> $out86 ${optionalString(skipRustAlternative!="")''87 echo "> Note: No results for Rust (alternative), ${skipRustAlternative}" >> $out88 echo >> $out89 ''}90 ${optionalString(skipGo!="")''91 echo "> Note: No results for Go, ${skipGo}" >> $out92 echo >> $out93 ''}94 ${optionalString(skipScala!="")''95 echo "> Note: No results for Scala/Scala (native)/Scala (GraalVM), ${skipScala}" >> $out96 echo >> $out97 ''}98 ${optionalString(skipCpp!="")''99 echo "> Note: No results for C++, ${skipCpp}" >> $out100 echo >> $out101 ''}102 ${optionalString(!quick&&!omitSource)''103 echo "<details>" >> $out104 echo "<summary>Source</summary>" >> $out105 echo >> $out106 echo "\`\`\`jsonnet" >> $out107 ${optionalStringpathIsGenerator"echo \"// Generator source\" >> $out"}108 cat ${path} >> $out109 echo >> $out110 echo "\`\`\`" >> $out111 echo "</details>" >> $out112 echo >> $out113 ''}114 path=${path}115 ${optionalStringpathIsGenerator''116 go-jsonnet $path > generated.jsonnet117 path=generated.jsonnet118 ''}119 hyperfine -N -w4 -m20 --output=pipe --style=basic --export-asciidoc result.adoc \120 ${121 concatStringsSep" "(122forEachjrsonnetVariants(123variant124"\"${variant.drv}/bin/jrsonnet $path${optionalString(vendor!="")" -J${vendor}"}\" -n \"Rust${125 ifvariant.name!=""then" (${variant.name})"else""126 }\""127)128)129 } \130 ${131 optionalString(skipRustAlternative=="")132"\"rsjsonnet $path${133 optionalString(vendor!="")" -J ${vendor}"134 }\" -n \"Rust (alternative, rsjsonnet)\""135 } \136 ${137 optionalString(skipGo=="")138"\"go-jsonnet $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"Go\""139 } \140 ${141 optionalString(skipScala=="")142"\"sjsonnet $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"Scala\""143 } \144 ${145 optionalString(skipScala=="")146"\"sjsonnet-native $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"Scala (native)\""147 } \148 ${149 optionalString(skipScala=="")150"\"sjsonnet-graalvm $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"Scala (GraalVM)\""151 } \152 ${optionalString(skipCpp=="")153"\"jsonnet $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"C++\""154 }155 cat result.adoc >> $out156 '';157 in158 ''159 set -oux160161 temp=$(mktemp -d)162 cd $temp163164 touch $out165 ${optionalString(!quick)''166 cat ${} >> $out167 echo >> $out168169 echo "<details>" >> $out170 echo "<summary>Tested versions</summary>" >> $out171 echo >> $out172 echo Go: $(go-jsonnet --version) >> $out173 echo >> $out174 echo "\`\`\`" >> $out175 go-jsonnet --help >> $out176 echo "\`\`\`" >> $out177 echo >> $out178 echo C++: $(jsonnet --version) >> $out179 echo >> $out180 echo "\`\`\`" >> $out181 jsonnet --help >> $out182 echo "\`\`\`" >> $out183 echo >> $out184 echo Scala: >> $out185 echo >> $out186 echo "\`\`\`" >> $out187 sjsonnet 2>> $out || true188 echo "\`\`\`" >> $out189 echo >> $out190 echo "Scala (native):" >> $out191 echo >> $out192 echo "\`\`\`" >> $out193 sjsonnet-native 2>> $out || true194 echo "\`\`\`" >> $out195 echo >> $out196 echo "Scala (GraalVM):" >> $out197 echo >> $out198 echo "\`\`\`" >> $out199 sjsonnet-graalvm 2>> $out || true200 echo "\`\`\`" >> $out201 echo >> $out202 echo "Rust (alternative):" >> $out203 echo >> $out204 echo "\`\`\`" >> $out205 rsjsonnet --help 2>> $out || true206 echo "\`\`\`" >> $out207 echo >> $out208 echo "</details>" >> $out209 echo >> $out210211 echo >> $out212 ''}213 echo "## Real world" >> $out214 ${mkBench{215name="Graalvm CI";216path="${graalvmBench}/ci.jsonnet";217omitSource=true;218skipCpp="takes longer than a hour";219skipGo=skipSlow;220skipScala=skipSlow;221}}222 ${mkBench{223name="Kube-prometheus manifests";224vendor="${kubePrometheusBench}/vendor";225path="${kubePrometheusBench}/example.jsonnet";226omitSource=true;227skipCpp="too slow, takes hours, skews results";228skipGo=skipSlow;229skipScala=skipSlow;230}}231232 echo >> $out233 echo "## Benchmarks from C++ jsonnet (/perf_tests)" >> $out234 ${mkBench{235name="Large string join";236path="${jsonnetBench}/perf_tests/large_string_join.jsonnet";237skipScala=skipSlow;238}}239 ${mkBench{240name="Large string template";241omitSource=true;242path="${jsonnetBench}/perf_tests/large_string_template.jsonnet";243skipGo="fails with os stack size exhausion";244skipCpp="too slow, takes hours, skews results";245skipScala=skipSlow;246}}247 ${mkBench{248name="Realistic 1";249path="${jsonnetBench}/perf_tests/realistic1.jsonnet";250skipGo=skipSlow;251skipCpp="too slow, takes hours, skews results";252skipScala=skipSlow;253}}254 ${mkBench{255name="Realistic 2";256path="${jsonnetBench}/perf_tests/realistic2.jsonnet";257skipGo=skipSlow;258skipCpp="too slow, takes hours, skews results";259skipScala=skipSlow;260}}261262 echo >> $out263 echo "## Benchmarks from C++ jsonnet (/benchmarks)" >> $out264 ${mkBench{265name="Tail call";266path="${jsonnetBench}/benchmarks/bench.01.jsonnet";267skipScala=skipSlow;268}}269 ${mkBench{270name="Inheritance recursion";271path="${jsonnetBench}/benchmarks/bench.02.jsonnet";272skipCpp=skipSlow;273skipGo=skipSlow;274}}275 ${mkBench{276name="Simple recursive call";277path="${jsonnetBench}/benchmarks/bench.03.jsonnet";278skipScala=skipSlow;279skipGo=skipSlow;280}}281 ${mkBench{282name="Foldl string concat";283path="${jsonnetBench}/benchmarks/bench.04.jsonnet";284skipCpp=skipSlow;285skipScala=skipSlow;286}}287 ${mkBench{288name="Array sorts";289path="${jsonnetBench}/benchmarks/bench.06.jsonnet";290skipCpp=skipSlow;291}}292 ${mkBench{293name="Lazy array";294path="${jsonnetBench}/benchmarks/bench.07.jsonnet";295skipGo=skipSlow;296skipScala=skipSlow;297}}298 ${mkBench{299name="Inheritance function recursion";300path="${jsonnetBench}/benchmarks/bench.08.jsonnet";301skipCpp=skipSlow;302skipScala=skipSlow;303}}304 ${mkBench{305name="String strips";306path="${jsonnetBench}/benchmarks/bench.09.jsonnet";307skipCpp="too slow, takes hours, skews results";308skipScala=skipSlow;309}}310 ${mkBench{311name="Big object";312path="${jsonnetBench}/benchmarks/gen_big_object.jsonnet";313pathIsGenerator=true;314skipScala=skipSlow;315}}316317 echo >> $out318 echo "## Benchmarks from Go jsonnet (builtins)" >> $out319 ${mkBench{320name="std.base64";321path="${goJsonnetBench}/base64.jsonnet";322skipRustAlternative=skipSlow;323skipCpp="too slow, takes hours, skews results";324skipScala=skipSlow;325}}326 ${mkBench{327name="std.base64Decode";328path="${goJsonnetBench}/base64Decode.jsonnet";329skipRustAlternative=skipSlow;330skipCpp=skipSlow;331skipScala=skipSlow;332}}333 ${mkBench{334name="std.base64DecodeBytes";335path="${goJsonnetBench}/base64DecodeBytes.jsonnet";336skipRustAlternative=skipSlow;337skipCpp=skipSlow;338skipGo=skipSlow;339skipScala=skipSlow;340}}341 ${mkBench{342name="std.base64 (byte array)";343path="${goJsonnetBench}/base64_byte_array.jsonnet";344skipRustAlternative=skipSlow;345skipCpp=skipSlow;346skipGo=skipSlow;347skipScala=skipSlow;348}}349 ${mkBench{350name="std.foldl";351path="${goJsonnetBench}/foldl.jsonnet";352skipScala=skipSlow;353}}354 ${mkBench{355name="std.manifestJsonEx";356path="${goJsonnetBench}/manifestJsonEx.jsonnet";357skipScala=skipSlow;358skipCpp=skipSlow;359}}360 ${mkBench{361name="std.manifestTomlEx";362path="${goJsonnetBench}/manifestTomlEx.jsonnet";363skipCpp=skipSlow;364}}365 ${mkBench{366name="std.parseInt";367path="${goJsonnetBench}/parseInt.jsonnet";368skipScala=skipSlow;369skipCpp=skipSlow;370}}371 ${mkBench{372name="std.reverse";373path="${goJsonnetBench}/reverse.jsonnet";374skipCpp=skipSlow;375skipGo=skipSlow;376}}377 ${mkBench{378name="std.substr";379path="${goJsonnetBench}/substr.jsonnet";380skipScala=skipSlow;381}}382 ${mkBench{383name="Comparsion for array";384path="${goJsonnetBench}/comparison.jsonnet";385skipCpp="too slow, takes hours, skews results";386}}387 ${mkBench{388name="Comparsion for primitives";389path="${goJsonnetBench}/comparison2.jsonnet";390skipRustAlternative=skipSlow;391skipCpp="can't run: uses up to 192GB of RAM";392skipGo=skipSlow;393skipScala=skipSlow;394}}395 '';396}nix/jrsonnet-release.nixdiffbeforeafterboth--- a/nix/jrsonnet-release.nix
+++ b/nix/jrsonnet-release.nix
@@ -24,6 +24,6 @@
buildInputs = [makeWrapper];
postInstall = ''
- wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000 --os-stack=200000"
+ wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"
'';
}
nix/jrsonnet.nixdiffbeforeafterboth--- a/nix/jrsonnet.nix
+++ b/nix/jrsonnet.nix
@@ -22,6 +22,6 @@
# To clean-up hyperfine output
postInstall = optionalString forBenchmarks ''
- wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000 --os-stack=200000"
+ wrapProgram $out/bin/jrsonnet --add-flags "--max-stack=200000"
'';
}
nix/sjsonnet.nixdiffbeforeafterboth--- a/nix/sjsonnet.nix
+++ b/nix/sjsonnet.nix
@@ -60,7 +60,7 @@
installPhase = ''
mkdir -p $out/bin $out/lib
cp $src $out/lib/sjsonnet.jar
- makeWrapper ${java}/bin/java $out/bin/sjsonnet --add-flags "-Xss100m -XX:+UseStringDeduplication -jar $out/lib/sjsonnet.jar"
+ makeWrapper ${java}/bin/java $out/bin/sjsonnet --add-flags "-Xss100m -XX:+UseStringDeduplication -jar $out/lib/sjsonnet.jar --max-stack 200000"
cp ${nativeSrc} $out/bin/sjsonnet-native
chmod +x $out/bin/sjsonnet-native