git.delta.rocks / jrsonnet / refs/commits / 4824700b357f

difftreelog

chore re-run benchmarks

Lach2026-04-01parent: #4808431.patch.diff
in: master

9 files changed

modifiedREADME.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]
addeddocs/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 
+|===
deleteddocs/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 |
addednix/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
deletednix/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
modifiednix/benchmarks.nixdiffbeforeafterboth
before · nix/benchmarks.nix
1{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            ${optionalString pathIsGenerator "echo \"// Generator source\" >> $out"}108            cat ${path} >> $out109            echo >> $out110            echo "\`\`\`" >> $out111            echo "</details>" >> $out112            echo >> $out113          ''}114          path=${path}115          ${optionalString pathIsGenerator ''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 " " (122                forEach jrsonnetVariants (123                  variant:124                  "\"${variant.drv}/bin/jrsonnet $path${optionalString (vendor != "") " -J${vendor}"}\" -n \"Rust${125                    if variant.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 ${./benchmarks.md} >> $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 {215        name = "Graalvm CI";216        path = "${graalvmBench}/ci.jsonnet";217        omitSource = true;218        skipCpp = "takes longer than a hour";219        skipGo = skipSlow;220        skipScala = skipSlow;221      }}222      ${mkBench {223        name = "Kube-prometheus manifests";224        vendor = "${kubePrometheusBench}/vendor";225        path = "${kubePrometheusBench}/example.jsonnet";226        omitSource = true;227        skipCpp = "too slow, takes hours, skews results";228        skipGo = skipSlow;229        skipScala = skipSlow;230      }}231232      echo >> $out233      echo "## Benchmarks from C++ jsonnet (/perf_tests)" >> $out234      ${mkBench {235        name = "Large string join";236        path = "${jsonnetBench}/perf_tests/large_string_join.jsonnet";237        skipScala = skipSlow;238      }}239      ${mkBench {240        name = "Large string template";241        omitSource = true;242        path = "${jsonnetBench}/perf_tests/large_string_template.jsonnet";243        skipGo = "fails with os stack size exhausion";244        skipCpp = "too slow, takes hours, skews results";245        skipScala = skipSlow;246      }}247      ${mkBench {248        name = "Realistic 1";249        path = "${jsonnetBench}/perf_tests/realistic1.jsonnet";250        skipGo = skipSlow;251        skipCpp = "too slow, takes hours, skews results";252        skipScala = skipSlow;253      }}254      ${mkBench {255        name = "Realistic 2";256        path = "${jsonnetBench}/perf_tests/realistic2.jsonnet";257        skipGo = skipSlow;258        skipCpp = "too slow, takes hours, skews results";259        skipScala = skipSlow;260      }}261262      echo >> $out263      echo "## Benchmarks from C++ jsonnet (/benchmarks)" >> $out264      ${mkBench {265        name = "Tail call";266        path = "${jsonnetBench}/benchmarks/bench.01.jsonnet";267        skipScala = skipSlow;268      }}269      ${mkBench {270        name = "Inheritance recursion";271        path = "${jsonnetBench}/benchmarks/bench.02.jsonnet";272        skipCpp = skipSlow;273        skipGo = skipSlow;274      }}275      ${mkBench {276        name = "Simple recursive call";277        path = "${jsonnetBench}/benchmarks/bench.03.jsonnet";278        skipScala = skipSlow;279        skipGo = skipSlow;280      }}281      ${mkBench {282        name = "Foldl string concat";283        path = "${jsonnetBench}/benchmarks/bench.04.jsonnet";284        skipCpp = skipSlow;285        skipScala = skipSlow;286      }}287      ${mkBench {288        name = "Array sorts";289        path = "${jsonnetBench}/benchmarks/bench.06.jsonnet";290        skipCpp = skipSlow;291      }}292      ${mkBench {293        name = "Lazy array";294        path = "${jsonnetBench}/benchmarks/bench.07.jsonnet";295        skipGo = skipSlow;296        skipScala = skipSlow;297      }}298      ${mkBench {299        name = "Inheritance function recursion";300        path = "${jsonnetBench}/benchmarks/bench.08.jsonnet";301        skipCpp = skipSlow;302        skipScala = skipSlow;303      }}304      ${mkBench {305        name = "String strips";306        path = "${jsonnetBench}/benchmarks/bench.09.jsonnet";307        skipCpp = "too slow, takes hours, skews results";308        skipScala = skipSlow;309      }}310      ${mkBench {311        name = "Big object";312        path = "${jsonnetBench}/benchmarks/gen_big_object.jsonnet";313        pathIsGenerator = true;314        skipScala = skipSlow;315      }}316317      echo >> $out318      echo "## Benchmarks from Go jsonnet (builtins)" >> $out319      ${mkBench {320        name = "std.base64";321        path = "${goJsonnetBench}/base64.jsonnet";322        skipRustAlternative = skipSlow;323        skipCpp = "too slow, takes hours, skews results";324        skipScala = skipSlow;325      }}326      ${mkBench {327        name = "std.base64Decode";328        path = "${goJsonnetBench}/base64Decode.jsonnet";329        skipRustAlternative = skipSlow;330        skipCpp = skipSlow;331        skipScala = skipSlow;332      }}333      ${mkBench {334        name = "std.base64DecodeBytes";335        path = "${goJsonnetBench}/base64DecodeBytes.jsonnet";336        skipRustAlternative = skipSlow;337        skipCpp = skipSlow;338        skipGo = skipSlow;339        skipScala = skipSlow;340      }}341      ${mkBench {342        name = "std.base64 (byte array)";343        path = "${goJsonnetBench}/base64_byte_array.jsonnet";344        skipRustAlternative = skipSlow;345        skipCpp = skipSlow;346        skipGo = skipSlow;347        skipScala = skipSlow;348      }}349      ${mkBench {350        name = "std.foldl";351        path = "${goJsonnetBench}/foldl.jsonnet";352        skipScala = skipSlow;353      }}354      ${mkBench {355        name = "std.manifestJsonEx";356        path = "${goJsonnetBench}/manifestJsonEx.jsonnet";357        skipScala = skipSlow;358        skipCpp = skipSlow;359      }}360      ${mkBench {361        name = "std.manifestTomlEx";362        path = "${goJsonnetBench}/manifestTomlEx.jsonnet";363        skipCpp = skipSlow;364      }}365      ${mkBench {366        name = "std.parseInt";367        path = "${goJsonnetBench}/parseInt.jsonnet";368        skipScala = skipSlow;369        skipCpp = skipSlow;370      }}371      ${mkBench {372        name = "std.reverse";373        path = "${goJsonnetBench}/reverse.jsonnet";374        skipCpp = skipSlow;375        skipGo = skipSlow;376      }}377      ${mkBench {378        name = "std.substr";379        path = "${goJsonnetBench}/substr.jsonnet";380        skipScala = skipSlow;381      }}382      ${mkBench {383        name = "Comparsion for array";384        path = "${goJsonnetBench}/comparison.jsonnet";385        skipCpp = "too slow, takes hours, skews results";386      }}387      ${mkBench {388        name = "Comparsion for primitives";389        path = "${goJsonnetBench}/comparison2.jsonnet";390        skipRustAlternative = skipSlow;391        skipCpp = "can't run: uses up to 192GB of RAM";392        skipGo = skipSlow;393        skipScala = skipSlow;394      }}395    '';396}
after · nix/benchmarks.nix
1{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 (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 ".Source" >> $out104            echo "[%collapsible]" >> $out105            echo "====" >> $out106            echo "[source,jsonnet]" >> $out107            echo "----" >> $out108            ${optionalString pathIsGenerator "echo \"// Generator source\" >> $out"}109            cat ${path} >> $out110            echo >> $out111            echo "----" >> $out112            echo "====" >> $out113            echo >> $out114          ''}115          path=${path}116          ${optionalString pathIsGenerator ''117            go-jsonnet $path > generated.jsonnet118            path=generated.jsonnet119          ''}120          hyperfine -N -w4 -m20 --output=pipe --style=basic --export-asciidoc result.adoc \121            ${122              concatStringsSep " " (123                forEach jrsonnetVariants (124                  variant:125                  "\"${variant.drv}/bin/jrsonnet $path${optionalString (vendor != "") " -J${vendor}"}\" -n \"Rust${126                    if variant.name != "" then " (${variant.name})" else ""127                  }\""128                )129              )130            } \131            ${132              optionalString (skipRustAlternative == "")133                "\"rsjsonnet $path${134                  optionalString (vendor != "") " -J ${vendor}"135                }\" -n \"Rust (alternative, rsjsonnet)\""136            } \137            ${138              optionalString (skipGo == "")139                "\"go-jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Go\""140            } \141            ${142              optionalString (skipScala == "")143                "\"sjsonnet-native $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (native)\""144            } \145            ${146              optionalString (skipScala == "")147                "\"sjsonnet-graalvm $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala (GraalVM)\""148            } \149            ${optionalString (skipCpp == "")150              "\"jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"C++\""151            }152          cat result.adoc >> $out153        '';154    in155    ''156      set -oux157      ulimit -s unlimited158159      temp=$(mktemp -d)160      cd $temp161162      touch $out163      ${optionalString (!quick) ''164        cat ${./benchmarks.adoc} >> $out165        echo >> $out166167        echo "CPU: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs), $(grep -c '^processor' /proc/cpuinfo) threads" >> $out168        echo >> $out169170        echo ".Tested versions" >> $out171        echo "[%collapsible]" >> $out172        echo "====" >> $out173        echo "* Go: $(go-jsonnet --version)" >> $out174        echo "* C++: $(jsonnet --version)" >> $out175        echo "* Scala (native/GraalVM): $(sjsonnet-native 2>&1 | grep -oP 'Sjsonnet \S+')" >> $out176        echo "* Rust (alternative): rsjsonnet ${rsjsonnet.version} (${rsjsonnet.src.rev})" >> $out177        ${concatStringsSep "\n" (forEach jrsonnetVariants (variant:178          "echo \"* Rust${if variant.name != "" then " (${variant.name})" else ""}: $(${variant.drv}/bin/jrsonnet --version 2>&1)\" >> $out"179        ))}180        echo "====" >> $out181        echo >> $out182      ''}183      echo "== Real world" >> $out184      ${mkBench {185        name = "Graalvm CI";186        path = "${graalvmBench}/ci.jsonnet";187        omitSource = true;188        skipCpp = "takes longer than a hour";189        skipGo = skipSlow;190        skipScala = skipSlow;191      }}192      ${mkBench {193        name = "Kube-prometheus manifests";194        vendor = "${kubePrometheusBench}/vendor";195        path = "${kubePrometheusBench}/example.jsonnet";196        omitSource = true;197        skipCpp = "too slow, takes hours, skews results";198        skipGo = skipSlow;199        skipScala = skipSlow;200      }}201202      echo >> $out203      echo "== Benchmarks from C++ jsonnet (/perf_tests)" >> $out204      ${mkBench {205        name = "Large string join";206        path = "${jsonnetBench}/perf_tests/large_string_join.jsonnet";207        skipScala = skipSlow;208      }}209      ${mkBench {210        name = "Large string template";211        omitSource = true;212        path = "${jsonnetBench}/perf_tests/large_string_template.jsonnet";213        skipGo = "fails with os stack size exhausion";214        skipCpp = "too slow, takes hours, skews results";215        skipScala = skipSlow;216      }}217      ${mkBench {218        name = "Realistic 1";219        path = "${jsonnetBench}/perf_tests/realistic1.jsonnet";220        skipGo = skipSlow;221        skipCpp = "too slow, takes hours, skews results";222        skipScala = skipSlow;223      }}224      ${mkBench {225        name = "Realistic 2";226        path = "${jsonnetBench}/perf_tests/realistic2.jsonnet";227        skipGo = skipSlow;228        skipCpp = "too slow, takes hours, skews results";229        skipScala = skipSlow;230      }}231232      echo >> $out233      echo "== Benchmarks from C++ jsonnet (/benchmarks)" >> $out234      ${mkBench {235        name = "Tail call";236        path = "${jsonnetBench}/benchmarks/bench.01.jsonnet";237        skipScala = skipSlow;238      }}239      ${mkBench {240        name = "Inheritance recursion";241        path = "${jsonnetBench}/benchmarks/bench.02.jsonnet";242        skipCpp = skipSlow;243        skipGo = skipSlow;244      }}245      ${mkBench {246        name = "Simple recursive call";247        path = "${jsonnetBench}/benchmarks/bench.03.jsonnet";248        skipScala = skipSlow;249        skipGo = skipSlow;250      }}251      ${mkBench {252        name = "Foldl string concat";253        path = "${jsonnetBench}/benchmarks/bench.04.jsonnet";254        skipCpp = skipSlow;255        skipScala = skipSlow;256      }}257      ${mkBench {258        name = "Array sorts";259        path = "${jsonnetBench}/benchmarks/bench.06.jsonnet";260        skipCpp = skipSlow;261      }}262      ${mkBench {263        name = "Lazy array";264        path = "${jsonnetBench}/benchmarks/bench.07.jsonnet";265        skipGo = skipSlow;266      }}267      ${mkBench {268        name = "Inheritance function recursion";269        path = "${jsonnetBench}/benchmarks/bench.08.jsonnet";270        skipCpp = skipSlow;271        skipScala = skipSlow;272      }}273      ${mkBench {274        name = "String strips";275        path = "${jsonnetBench}/benchmarks/bench.09.jsonnet";276        skipCpp = "too slow, takes hours, skews results";277        skipScala = skipSlow;278      }}279      ${mkBench {280        name = "Big object";281        path = "${jsonnetBench}/benchmarks/gen_big_object.jsonnet";282        pathIsGenerator = true;283        skipScala = skipSlow;284      }}285286      echo >> $out287      echo "== Benchmarks from Go jsonnet (builtins)" >> $out288      ${mkBench {289        name = "std.base64";290        path = "${goJsonnetBench}/base64.jsonnet";291        skipRustAlternative = skipSlow;292        skipCpp = "too slow, takes hours, skews results";293        skipScala = skipSlow;294      }}295      ${mkBench {296        name = "std.base64Decode";297        path = "${goJsonnetBench}/base64Decode.jsonnet";298        skipRustAlternative = skipSlow;299        skipCpp = skipSlow;300        skipScala = skipSlow;301      }}302      ${mkBench {303        name = "std.base64DecodeBytes";304        path = "${goJsonnetBench}/base64DecodeBytes.jsonnet";305        skipRustAlternative = skipSlow;306        skipCpp = skipSlow;307        skipGo = skipSlow;308        skipScala = skipSlow;309      }}310      ${mkBench {311        name = "std.base64 (byte array)";312        path = "${goJsonnetBench}/base64_byte_array.jsonnet";313        skipRustAlternative = skipSlow;314        skipCpp = skipSlow;315        skipGo = skipSlow;316        skipScala = skipSlow;317      }}318      ${mkBench {319        name = "std.foldl";320        path = "${goJsonnetBench}/foldl.jsonnet";321        skipScala = skipSlow;322      }}323      ${mkBench {324        name = "std.manifestJsonEx";325        path = "${goJsonnetBench}/manifestJsonEx.jsonnet";326        skipScala = skipSlow;327        skipCpp = skipSlow;328      }}329      ${mkBench {330        name = "std.manifestTomlEx";331        path = "${goJsonnetBench}/manifestTomlEx.jsonnet";332        skipCpp = skipSlow;333      }}334      ${mkBench {335        name = "std.parseInt";336        path = "${goJsonnetBench}/parseInt.jsonnet";337        skipScala = skipSlow;338        skipCpp = skipSlow;339      }}340      ${mkBench {341        name = "std.reverse";342        path = "${goJsonnetBench}/reverse.jsonnet";343        skipCpp = skipSlow;344        skipGo = skipSlow;345      }}346      ${mkBench {347        name = "std.substr";348        path = "${goJsonnetBench}/substr.jsonnet";349        skipScala = skipSlow;350      }}351      ${mkBench {352        name = "Comparsion for array";353        path = "${goJsonnetBench}/comparison.jsonnet";354        skipCpp = "too slow, takes hours, skews results";355      }}356      ${mkBench {357        name = "Comparsion for primitives";358        path = "${goJsonnetBench}/comparison2.jsonnet";359        skipRustAlternative = skipSlow;360        skipCpp = "can't run: uses up to 192GB of RAM";361        skipGo = skipSlow;362        skipScala = skipSlow;363      }}364    '';365}
modifiednix/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"
   '';
 }
modifiednix/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"
     '';
   }
modifiednix/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