difftreelog
ci reenable scala for quick benchmarking
in: master
1 file changed
nix/benchmarks.nixdiffbeforeafterboth1{2 lib,3 runCommand,4 jsonnet-bundler,5 cacert,6 stdenv,7 fetchFromGitHub,8 go-jsonnet,9 sjsonnet,10 cpp-jsonnet,11 rsjsonnet,12 hyperfine,13 quick ? false,14 jrsonnetVariants,15}:16with lib;17let18 inherit (cpp-jsonnet) jsonnetBench;19 inherit (go-jsonnet) goJsonnetBench;20 graalvmBench = fetchFromGitHub {21 owner = "oracle";22 repo = "graal";23 rev = "bc305df3fe587960f7635f0185571500e5988475";24 hash = "sha256-4EKB1b2o4/qtYQ+nqbbs621OJrtjApsAWEBcw5EjrYc=";25 };26 kubePrometheusBench =27 let28 src = fetchFromGitHub {29 owner = "prometheus-operator";30 repo = "kube-prometheus";31 rev = "d3889807798d1697ea0691f10caf1b6a1997a8bd";32 hash = "sha256-TeYWHzoZAmDp2PzT7EH8XRUcvb3tR8Qfxel7o2QBvIM=";33 };34 in35 runCommand "kube-prometheus-vendor"36 {37 outputHash = "sha256-AGc0dHlD/Ld7I5b1+gOotzJkYrn+bB1VjISdD5NITtw=";38 outputHashMode = "recursive";39 buildInputs = [ cacert ];40 }41 ''42 mkdir -p $out43 cp -r ${src}/* $out/44 cd $out45 chmod u+w jsonnetfile.lock.json46 mkdir vendor47 ${jsonnet-bundler}/bin/jb install48 '';4950 # Removes outsiders from the output51 # Useful when comparing performance of different jrsonnet releases52 skipSlow = if quick then "slow benchmark, but only quick requested" else "";53in54stdenv.mkDerivation {55 name = "benchmarks";56 # __impure = true; # not supported by hercules-ci57 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(!omitSource)''103 echo ".Source" >> $out104 echo "[%collapsible]" >> $out105 echo "====" >> $out106 echo "[source,jsonnet]" >> $out107 echo "----" >> $out108 ${optionalStringpathIsGenerator"echo \"// Generator source\" >> $out"}109 cat ${path} >> $out110 echo >> $out111 echo "----" >> $out112 echo "====" >> $out113 echo >> $out114 ''}115 path=${path}116 ${optionalStringpathIsGenerator''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" "(123forEachjrsonnetVariants(124variant125"\"${variant.drv}/bin/jrsonnet $path${optionalString(vendor!="")" -J${vendor}"}\" -n \"Rust${126 ifvariant.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 147 148 optionalString(skipScala==""&&stdenv.hostPlatform.system!="aarch64-linux")149"\"sjsonnet-graalvm $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"Scala (GraalVM)\""150 } \151 ${optionalString(skipCpp=="")152"\"jsonnet $path${optionalString(vendor!="")" -J ${vendor}"}\" -n \"C++\""153 }154 cat result.adoc >> $out155 '';156 in157 ''158 set -oux159 ulimit -s unlimited160161 temp=$(mktemp -d)162 cd $temp163164 touch $out165 ${optionalString(true)''166 cat ${} >> $out167 echo >> $out168169 echo "CPU: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs), $(grep -c '^processor' /proc/cpuinfo) threads" >> $out170 echo >> $out171172 echo ".Tested versions" >> $out173 echo "[%collapsible]" >> $out174 echo "====" >> $out175 echo "* Go: $(go-jsonnet --version)" >> $out176 echo "* C++: $(jsonnet --version)" >> $out177 echo "* Scala (native/GraalVM): $(sjsonnet-native 2>&1 | grep -oP 'Sjsonnet \S+')" >> $out178 echo "* Rust (alternative): rsjsonnet ${rsjsonnet.version} (${rsjsonnet.src.rev})" >> $out179 ${concatStringsSep"\n"(180forEachjrsonnetVariants(181variant182"echo \"* Rust${183 ifvariant.name!=""then" (${variant.name})"else""184 }: $(${variant.drv}/bin/jrsonnet --version 2>&1)\" >> $out"185)186)}187 echo "====" >> $out188 echo >> $out189 ''}190 echo "== Real world" >> $out191 ${mkBench{192name="Graalvm CI";193path="${graalvmBench}/ci.jsonnet";194omitSource=true;195skipCpp="takes longer than a hour";196skipGo=skipSlow;197}}198 ${mkBench{199name="Kube-prometheus manifests";200vendor="${kubePrometheusBench}/vendor";201path="${kubePrometheusBench}/example.jsonnet";202omitSource=true;203skipCpp="too slow, takes hours, skews results";204skipGo=skipSlow;205}}206207 echo >> $out208 echo "== Benchmarks from C++ jsonnet (/perf_tests)" >> $out209 ${mkBench{210name="Large string join";211path="${jsonnetBench}/perf_tests/large_string_join.jsonnet";212}}213 ${mkBench{214name="Large string template";215omitSource=true;216path="${jsonnetBench}/perf_tests/large_string_template.jsonnet";217skipGo="fails with os stack size exhausion";218skipCpp="too slow, takes hours, skews results";219}}220 ${mkBench{221name="Realistic 1";222path="${jsonnetBench}/perf_tests/realistic1.jsonnet";223skipGo=skipSlow;224skipCpp="too slow, takes hours, skews results";225}}226 ${mkBench{227name="Realistic 2";228path="${jsonnetBench}/perf_tests/realistic2.jsonnet";229skipGo=skipSlow;230skipCpp="too slow, takes hours, skews results";231}}232233 echo >> $out234 echo "== Benchmarks from C++ jsonnet (/benchmarks)" >> $out235 ${mkBench{236name="Tail call";237path="${jsonnetBench}/benchmarks/bench.01.jsonnet";238}}239 ${mkBench{240name="Inheritance recursion";241path="${jsonnetBench}/benchmarks/bench.02.jsonnet";242skipCpp=skipSlow;243skipGo=skipSlow;244}}245 ${mkBench{246name="Simple recursive call";247path="${jsonnetBench}/benchmarks/bench.03.jsonnet";248skipGo=skipSlow;249}}250 ${mkBench{251name="Foldl string concat";252path="${jsonnetBench}/benchmarks/bench.04.jsonnet";253skipCpp=skipSlow;254}}255 ${mkBench{256name="Array sorts";257path="${jsonnetBench}/benchmarks/bench.06.jsonnet";258skipCpp=skipSlow;259}}260 ${mkBench{261name="Lazy array";262path="${jsonnetBench}/benchmarks/bench.07.jsonnet";263skipGo=skipSlow;264}}265 ${mkBench{266name="Inheritance function recursion";267path="${jsonnetBench}/benchmarks/bench.08.jsonnet";268skipCpp=skipSlow;269}}270 ${mkBench{271name="String strips";272path="${jsonnetBench}/benchmarks/bench.09.jsonnet";273skipCpp="too slow, takes hours, skews results";274}}275 ${mkBench{276name="Big object";277path="${jsonnetBench}/benchmarks/gen_big_object.jsonnet";278pathIsGenerator=true;279}}280281 echo >> $out282 echo "== Benchmarks from Go jsonnet (builtins)" >> $out283 ${mkBench{284name="std.base64";285path="${goJsonnetBench}/base64.jsonnet";286skipRustAlternative=skipSlow;287skipCpp="too slow, takes hours, skews results";288}}289 ${mkBench{290name="std.base64Decode";291path="${goJsonnetBench}/base64Decode.jsonnet";292skipRustAlternative=skipSlow;293skipCpp=skipSlow;294}}295 ${mkBench{296name="std.base64DecodeBytes";297path="${goJsonnetBench}/base64DecodeBytes.jsonnet";298skipRustAlternative=skipSlow;299skipCpp=skipSlow;300skipGo=skipSlow;301}}302 ${mkBench{303name="std.base64 (byte array)";304path="${goJsonnetBench}/base64_byte_array.jsonnet";305skipRustAlternative=skipSlow;306skipCpp=skipSlow;307skipGo=skipSlow;308}}309 ${mkBench{310name="std.foldl";311path="${goJsonnetBench}/foldl.jsonnet";312}}313 ${mkBench{314name="std.manifestJsonEx";315path="${goJsonnetBench}/manifestJsonEx.jsonnet";316skipCpp=skipSlow;317}}318 ${mkBench{319name="std.manifestTomlEx";320path="${goJsonnetBench}/manifestTomlEx.jsonnet";321skipCpp=skipSlow;322}}323 ${mkBench{324name="std.parseInt";325path="${goJsonnetBench}/parseInt.jsonnet";326skipCpp=skipSlow;327}}328 ${mkBench{329name="std.reverse";330path="${goJsonnetBench}/reverse.jsonnet";331skipCpp=skipSlow;332skipGo=skipSlow;333}}334 ${mkBench{335name="std.substr";336path="${goJsonnetBench}/substr.jsonnet";337}}338 ${mkBench{339name="Comparsion for array";340path="${goJsonnetBench}/comparison.jsonnet";341skipCpp="too slow, takes hours, skews results";342}}343 ${mkBench{344name="Comparsion for primitives";345path="${goJsonnetBench}/comparison2.jsonnet";346skipRustAlternative=skipSlow;347skipCpp="can't run: uses up to 192GB of RAM";348skipGo=skipSlow;349}}350 '';351}