difftreelog
ci benchmark against stable release
in: master
4 files changed
flake.nixdiffbeforeafterboth--- a/flake.nix
+++ b/flake.nix
@@ -29,9 +29,28 @@
cargo = rust;
};
};
+ jrsonnet-release = pkgs.callPackage ./nix/jrsonnet-release.nix {
+ rustPlatform = pkgs.makeRustPlatform {
+ rustc = rust;
+ cargo = rust;
+ };
+ };
benchmarks = pkgs.callPackage ./nix/benchmarks.nix {
- inherit go-jsonnet sjsonnet jsonnet jrsonnet;
+ inherit go-jsonnet sjsonnet jsonnet jrsonnet jrsonnet-release;
+ };
+ benchmarks-quick = pkgs.callPackage ./nix/benchmarks.nix {
+ inherit go-jsonnet sjsonnet jsonnet jrsonnet jrsonnet-release;
+ quick = true;
+ };
+ benchmarks-against-release = pkgs.callPackage ./nix/benchmarks.nix {
+ inherit go-jsonnet sjsonnet jsonnet jrsonnet jrsonnet-release;
+ againstRelease = true;
+ };
+ benchmarks-quick-against-release = pkgs.callPackage ./nix/benchmarks.nix {
+ inherit go-jsonnet sjsonnet jsonnet jrsonnet jrsonnet-release;
+ quick = true;
+ againstRelease = true;
};
};
devShell = pkgs.mkShell {
nix/benchmarks.nixdiffbeforeafterboth1{ lib2, runCommand3, jsonnet-bundler4, cacert5, stdenv6, fetchFromGitHub7, jrsonnet8, go-jsonnet9, sjsonnet10, jsonnet11, hyperfine12, quick ? false13}:14let15 jsonnetBench = fetchFromGitHub {16 rev = "v0.19.1";17 owner = "google";18 repo = "jsonnet";19 hash = "sha256-q1MNdbyrx4vvN5woe0o90pPqaNtsZjI5RQ7KJt7rOpU=";20 };21 goJsonnetBench = (fetchFromGitHub {22 owner = "google";23 repo = "go-jsonnet";24 rev = "v0.19.1";25 hash = "sha256-FgQYnas0qkIedRAA8ApZXLzEylg6PS6+8zzl7j+yOeI=";26 }) + "/builtin-benchmarks";27 graalvmBench = fetchFromGitHub {28 owner = "oracle";29 repo = "graal";30 rev = "bc305df3fe587960f7635f0185571500e5988475";31 hash = "sha256-4EKB1b2o4/qtYQ+nqbbs621OJrtjApsAWEBcw5EjrYc=";32 };33 kubePrometheusBench =34 let35 src = fetchFromGitHub {36 owner = "prometheus-operator";37 repo = "kube-prometheus";38 rev = "6a570e3154eac26e32da61d784fbe626da4804df";39 hash = "sha256-s6BK8KQiSjql2w6R+8m5pvPPAcKW+SKjQwqxZHjimFw=";40 };41 in42 runCommand "kube-prometheus-vendor"43 {44 outputHash = "sha256-R60RI/7FQPOHisnzANb34m9WPj5D9FeMVoGOjB19zl8=";45 outputHashMode = "recursive";46 buildInputs = [ cacert ];47 }48 ''49 mkdir -p $out50 cp -r ${src}/* $out/51 cd $out52 mkdir vendor53 ${jsonnet-bundler}/bin/jb install54 '';5556 skipSlow = if quick then "slow benchmark" else "";57in58stdenv.mkDerivation {59 name = "benchmarks";60 __impure = true;61 unpackPhase = "true";6263 buildInputs = [64 jrsonnet65 go-jsonnet66 sjsonnet67 jsonnet6869 hyperfine70 ];7172 installPhase =73 let74 mkBench = { name, path, omitSource ? false, pathIsGenerator ? false, skipScala ? "", skipCpp ? "", skipGo ? "", vendor ? "" }: ''75 set -oux7677 echo >> $out78 echo "### ${name}" >> $out79 echo >> $out80 ${ifskipGo!=""then''81 echo "> Note: No results for Go, ${skipGo}" >> $out82 echo >> $out83 ''else""}84 ${ifskipScala!=""then''85 echo "> Note: No results for Scala, ${skipScala}" >> $out86 echo >> $out87 ''else""}88 ${ifskipCpp!=""then''89 echo "> Note: No results for C++, ${skipCpp}" >> $out90 echo >> $out91 ''else""}92 echo "<details>" >> $out93 echo "<summary>Source</summary>" >> $out94 echo >> $out95 echo "\`\`\`jsonnet" >> $out96 ${ifpathIsGeneratorthen"echo \"// Generator source\" >> $out"else""}97 ${ifomitSourcethen"echo \"// Omitted: too large\" >> $out"else"cat ${path} >> $out"}98 echo >> $out99 echo "\`\`\`" >> $out100 echo "</details>" >> $out101 echo >> $out102 path=${path}103 ${ifpathIsGeneratorthen''104 jrsonnet $path > generated.jsonnet105 path=generated.jsonnet106 ''else""}107 hyperfine -N ${ifquickthen"-r1"else""} --output=pipe --style=basic --export-markdown result.md \108 "jrsonnet $path ${ifvendor!=""then"-J${vendor}"else""}" -n "Rust" \109 ${ifskipGo==""then"\"go-jsonnet $path ${ifvendor!=""then"-J ${vendor}"else""}\" -n \"Go\""else"" } \110 ${ifskipScala==""then"\"sjsonnet $path ${ifvendor!=""then"-J ${vendor}"else""}\" -n \"Scala\""else"" } \111 ${ifskipCpp==""then"\"jsonnet $path ${ifvendor!=""then"-J ${vendor}"else""}\" -n \"C++\""else"" }112 cat result.md >> $out113 '';114 in115 ''116 touch $out117 cat ${} >> $out118 echo >> $out119120 echo "<details>" >> $out121 echo "<summary>Tested versions</summary>" >> $out122 echo >> $out123 echo Rust: git as $(date +'%d.%m.%Y' -u) >> $out124 echo >> $out125 echo "\`\`\`" >> $out126 jrsonnet --help >> $out127 echo "\`\`\`" >> $out128 echo >> $out129 echo Go: $(go-jsonnet --version) >> $out130 echo >> $out131 echo "\`\`\`" >> $out132 go-jsonnet --help >> $out133 echo "\`\`\`" >> $out134 echo >> $out135 echo C++: $(jsonnet --version) >> $out136 echo >> $out137 echo "\`\`\`" >> $out138 jsonnet --help >> $out139 echo "\`\`\`" >> $out140 echo >> $out141 echo Scala: >> $out142 echo >> $out143 echo "\`\`\`" >> $out144 sjsonnet 2>> $out || true145 echo "\`\`\`" >> $out146 echo >> $out147 echo "</details>" >> $out148 echo >> $out149150 echo >> $out151 echo "## Real world" >> $out152 ${mkBench{name="Graalvm CI";path="${graalvmBench}/ci.jsonnet";skipCpp="takes longer than a hour";}}153 ${mkBench{name="Kube-prometheus manifests";vendor="${kubePrometheusBench}/vendor";path="${kubePrometheusBench}/example.jsonnet";skipCpp=skipSlow;}}154155 echo >> $out156 echo "## Benchmarks from C++ jsonnet (/perf_tests)" >> $out157 ${mkBench{name="Large string join";path="${jsonnetBench}/perf_tests/large_string_join.jsonnet";}}158 ${mkBench{name="Large string template";omitSource=true;path="${jsonnetBench}/perf_tests/large_string_template.jsonnet";skipGo="fails with os stack size exhausion";skipCpp=skipSlow;}}159 ${mkBench{name="Realistic 1";path="${jsonnetBench}/perf_tests/realistic1.jsonnet";skipGo=skipSlow;skipCpp=skipSlow;}}160 ${mkBench{name="Realistic 2";path="${jsonnetBench}/perf_tests/realistic2.jsonnet";skipGo=skipSlow;skipCpp=skipSlow;}}161162 echo >> $out163 echo "## Benchmarks from C++ jsonnet (/benchmarks)" >> $out164 ${mkBench{name="Tail call";path="${jsonnetBench}/benchmarks/bench.01.jsonnet";}}165 ${mkBench{name="Inheritance recursion";path="${jsonnetBench}/benchmarks/bench.02.jsonnet";skipCpp=skipSlow;}}166 ${mkBench{name="Simple recursive call";path="${jsonnetBench}/benchmarks/bench.03.jsonnet";}}167 ${mkBench{name="Foldl string concat";path="${jsonnetBench}/benchmarks/bench.04.jsonnet";}}168 ${mkBench{name="Array sorts";path="${jsonnetBench}/benchmarks/bench.06.jsonnet";skipScala="std.reverse is not implemented";skipCpp=skipSlow;}}169 ${mkBench{name="Lazy array";path="${jsonnetBench}/benchmarks/bench.07.jsonnet";}}170 ${mkBench{name="Inheritance function recursion";path="${jsonnetBench}/benchmarks/bench.08.jsonnet";}}171 ${mkBench{name="String strips";path="${jsonnetBench}/benchmarks/bench.09.jsonnet";skipCpp=skipSlow;}}172 ${mkBench{name="Big object";path="${jsonnetBench}/benchmarks/gen_big_object.jsonnet";pathIsGenerator=true;}}173174 echo >> $out175 echo "## Benchmarks from Go jsonnet (builtins)" >> $out176 ${mkBench{name="std.base64";path="${goJsonnetBench}/base64.jsonnet";skipCpp=skipSlow;}}177 ${mkBench{name="std.base64Decode";path="${goJsonnetBench}/base64Decode.jsonnet";skipCpp=skipSlow;}}178 ${mkBench{name="std.base64DecodeBytes";path="${goJsonnetBench}/base64DecodeBytes.jsonnet";skipCpp=skipSlow;}}179 ${mkBench{name="std.base64 (byte array)";path="${goJsonnetBench}/base64_byte_array.jsonnet";skipCpp=skipSlow;}}180 ${mkBench{name="std.foldl";path="${goJsonnetBench}/foldl.jsonnet";}}181 ${mkBench{name="std.manifestJsonEx";path="${goJsonnetBench}/manifestJsonEx.jsonnet";}}182 ${mkBench{name="std.manifestTomlEx";path="${goJsonnetBench}/manifestTomlEx.jsonnet";skipScala="std.manifestTomlEx is not implemented";}}183 ${mkBench{name="std.parseInt";path="${goJsonnetBench}/parseInt.jsonnet";}}184 ${mkBench{name="std.reverse";path="${goJsonnetBench}/reverse.jsonnet";skipScala="std.reverse is not implemented";}}185 ${mkBench{name="std.substr";path="${goJsonnetBench}/substr.jsonnet";}}186 ${mkBench{name="Comparsion for array";path="${goJsonnetBench}/comparison.jsonnet";skipScala="array comparsion is not implemented";skipCpp=skipSlow;}}187 ${mkBench{name="Comparsion for primitives";path="${goJsonnetBench}/comparison2.jsonnet";skipCpp="can't run: uses up to 192GB of RAM";}}188 '';189}1{ lib2, runCommand3, jsonnet-bundler4, cacert5, stdenv6, fetchFromGitHub7, jrsonnet8, jrsonnet-release9, go-jsonnet10, sjsonnet11, jsonnet12, hyperfine13, quick ? false14, againstRelease ? false15}:16let17 jsonnetBench = fetchFromGitHub {18 rev = "v0.19.1";19 owner = "google";20 repo = "jsonnet";21 hash = "sha256-q1MNdbyrx4vvN5woe0o90pPqaNtsZjI5RQ7KJt7rOpU=";22 };23 goJsonnetBench = (fetchFromGitHub {24 owner = "google";25 repo = "go-jsonnet";26 rev = "v0.19.1";27 hash = "sha256-FgQYnas0qkIedRAA8ApZXLzEylg6PS6+8zzl7j+yOeI=";28 }) + "/builtin-benchmarks";29 graalvmBench = fetchFromGitHub {30 owner = "oracle";31 repo = "graal";32 rev = "bc305df3fe587960f7635f0185571500e5988475";33 hash = "sha256-4EKB1b2o4/qtYQ+nqbbs621OJrtjApsAWEBcw5EjrYc=";34 };35 kubePrometheusBench =36 let37 src = fetchFromGitHub {38 owner = "prometheus-operator";39 repo = "kube-prometheus";40 rev = "6a570e3154eac26e32da61d784fbe626da4804df";41 hash = "sha256-s6BK8KQiSjql2w6R+8m5pvPPAcKW+SKjQwqxZHjimFw=";42 };43 in44 runCommand "kube-prometheus-vendor"45 {46 outputHash = "sha256-R60RI/7FQPOHisnzANb34m9WPj5D9FeMVoGOjB19zl8=";47 outputHashMode = "recursive";48 buildInputs = [ cacert ];49 }50 ''51 mkdir -p $out52 cp -r ${src}/* $out/53 cd $out54 mkdir vendor55 ${jsonnet-bundler}/bin/jb install56 '';5758 # Removes outsiders from the output59 # Useful when comparing performance of different jrsonnet releases60 skipSlow = if quick then "slow benchmark, but only quick requested" else "";61in62stdenv.mkDerivation {63 name = "benchmarks";64 __impure = true;65 unpackPhase = "true";6667 buildInputs = [68 jrsonnet69 go-jsonnet70 sjsonnet71 jsonnet7273 hyperfine74 ] ++ (if againstRelease then [ jrsonnet-release ] else [ ]);7576 installPhase =77 let78 mkBench = { name, path, omitSource ? false, pathIsGenerator ? false, skipScala ? "", skipCpp ? "", skipGo ? "", vendor ? "" }: ''79 set -oux8081 echo >> $out82 echo "### ${name}" >> $out83 echo >> $out84 ${ifskipGo!=""then''85 echo "> Note: No results for Go, ${skipGo}" >> $out86 echo >> $out87 ''else""}88 ${ifskipScala!=""then''89 echo "> Note: No results for Scala, ${skipScala}" >> $out90 echo >> $out91 ''else""}92 ${ifskipCpp!=""then''93 echo "> Note: No results for C++, ${skipCpp}" >> $out94 echo >> $out95 ''else""}96 ${if!quickthen''97 echo "<details>" >> $out98 echo "<summary>Source</summary>" >> $out99 echo >> $out100 echo "\`\`\`jsonnet" >> $out101 ${ifpathIsGeneratorthen"echo \"// Generator source\" >> $out"else""}102 ${ifomitSourcethen"echo \"// Omitted: too large\" >> $out"else"cat ${path} >> $out"}103 echo >> $out104 echo "\`\`\`" >> $out105 echo "</details>" >> $out106 echo >> $out107 ''else""}108 path=${path}109 ${ifpathIsGeneratorthen''110 jrsonnet $path > generated.jsonnet111 path=generated.jsonnet112 ''else""}113 hyperfine -N -w4 --output=pipe --style=basic --export-markdown result.md \114 "jrsonnet $path ${ifvendor!=""then"-J${vendor}"else""}" -n "Rust" \115 ${ifagainstReleasethen"\"jrsonnet-release $path ${ifvendor!=""then"-J${vendor}"else""}\" -n \"Rust (released)\""else"" } \116 ${ifskipGo==""then"\"go-jsonnet $path ${ifvendor!=""then"-J ${vendor}"else""}\" -n \"Go\""else"" } \117 ${ifskipScala==""then"\"sjsonnet $path ${ifvendor!=""then"-J ${vendor}"else""}\" -n \"Scala\""else"" } \118 ${ifskipCpp==""then"\"jsonnet $path ${ifvendor!=""then"-J ${vendor}"else""}\" -n \"C++\""else"" }119 cat result.md >> $out120 '';121 in122 ''123 touch $out124 ${if!quickthen''125 cat ${} >> $out126 echo >> $out127128 echo "<details>" >> $out129 echo "<summary>Tested versions</summary>" >> $out130 echo >> $out131 echo Rust: git as $(date +'%d.%m.%Y' -u) >> $out132 echo >> $out133 echo "\`\`\`" >> $out134 jrsonnet --help >> $out135 echo "\`\`\`" >> $out136 echo >> $out137 echo Go: $(go-jsonnet --version) >> $out138 echo >> $out139 echo "\`\`\`" >> $out140 go-jsonnet --help >> $out141 echo "\`\`\`" >> $out142 echo >> $out143 echo C++: $(jsonnet --version) >> $out144 echo >> $out145 echo "\`\`\`" >> $out146 jsonnet --help >> $out147 echo "\`\`\`" >> $out148 echo >> $out149 echo Scala: >> $out150 echo >> $out151 echo "\`\`\`" >> $out152 sjsonnet 2>> $out || true153 echo "\`\`\`" >> $out154 echo >> $out155 echo "</details>" >> $out156 echo >> $out157158 echo >> $out159 ''else""}160 echo "## Real world" >> $out161 ${mkBench{name="Graalvm CI";path="${graalvmBench}/ci.jsonnet";skipCpp="takes longer than a hour";}}162 ${mkBench{name="Kube-prometheus manifests";vendor="${kubePrometheusBench}/vendor";path="${kubePrometheusBench}/example.jsonnet";skipCpp=skipSlow;}}163164 echo >> $out165 echo "## Benchmarks from C++ jsonnet (/perf_tests)" >> $out166 ${mkBench{name="Large string join";path="${jsonnetBench}/perf_tests/large_string_join.jsonnet";}}167 ${mkBench{name="Large string template";omitSource=true;path="${jsonnetBench}/perf_tests/large_string_template.jsonnet";skipGo="fails with os stack size exhausion";skipCpp=skipSlow;}}168 ${mkBench{name="Realistic 1";path="${jsonnetBench}/perf_tests/realistic1.jsonnet";skipGo=skipSlow;skipCpp=skipSlow;}}169 ${mkBench{name="Realistic 2";path="${jsonnetBench}/perf_tests/realistic2.jsonnet";skipGo=skipSlow;skipCpp=skipSlow;}}170171 echo >> $out172 echo "## Benchmarks from C++ jsonnet (/benchmarks)" >> $out173 ${mkBench{name="Tail call";path="${jsonnetBench}/benchmarks/bench.01.jsonnet";}}174 ${mkBench{name="Inheritance recursion";path="${jsonnetBench}/benchmarks/bench.02.jsonnet";skipCpp=skipSlow;}}175 ${mkBench{name="Simple recursive call";path="${jsonnetBench}/benchmarks/bench.03.jsonnet";}}176 ${mkBench{name="Foldl string concat";path="${jsonnetBench}/benchmarks/bench.04.jsonnet";}}177 ${mkBench{name="Array sorts";path="${jsonnetBench}/benchmarks/bench.06.jsonnet";skipScala="std.reverse is not implemented";skipCpp=skipSlow;}}178 ${mkBench{name="Lazy array";path="${jsonnetBench}/benchmarks/bench.07.jsonnet";}}179 ${mkBench{name="Inheritance function recursion";path="${jsonnetBench}/benchmarks/bench.08.jsonnet";}}180 ${mkBench{name="String strips";path="${jsonnetBench}/benchmarks/bench.09.jsonnet";skipCpp=skipSlow;}}181 ${mkBench{name="Big object";path="${jsonnetBench}/benchmarks/gen_big_object.jsonnet";pathIsGenerator=true;}}182183 echo >> $out184 echo "## Benchmarks from Go jsonnet (builtins)" >> $out185 ${mkBench{name="std.base64";path="${goJsonnetBench}/base64.jsonnet";skipCpp=skipSlow;}}186 ${mkBench{name="std.base64Decode";path="${goJsonnetBench}/base64Decode.jsonnet";skipCpp=skipSlow;}}187 ${mkBench{name="std.base64DecodeBytes";path="${goJsonnetBench}/base64DecodeBytes.jsonnet";skipCpp=skipSlow;}}188 ${mkBench{name="std.base64 (byte array)";path="${goJsonnetBench}/base64_byte_array.jsonnet";skipCpp=skipSlow;}}189 ${mkBench{name="std.foldl";path="${goJsonnetBench}/foldl.jsonnet";}}190 ${mkBench{name="std.manifestJsonEx";path="${goJsonnetBench}/manifestJsonEx.jsonnet";}}191 ${mkBench{name="std.manifestTomlEx";path="${goJsonnetBench}/manifestTomlEx.jsonnet";skipScala="std.manifestTomlEx is not implemented";}}192 ${mkBench{name="std.parseInt";path="${goJsonnetBench}/parseInt.jsonnet";}}193 ${mkBench{name="std.reverse";path="${goJsonnetBench}/reverse.jsonnet";skipScala="std.reverse is not implemented";}}194 ${mkBench{name="std.substr";path="${goJsonnetBench}/substr.jsonnet";}}195 ${mkBench{name="Comparsion for array";path="${goJsonnetBench}/comparison.jsonnet";skipScala="array comparsion is not implemented";skipCpp=skipSlow;}}196 ${mkBench{name="Comparsion for primitives";path="${goJsonnetBench}/comparison2.jsonnet";skipCpp="can't run: uses up to 192GB of RAM";}}197 '';198}nix/jrsonnet-release.nixdiffbeforeafterboth--- a/nix/jrsonnet-release.nix
+++ b/nix/jrsonnet-release.nix
@@ -3,14 +3,15 @@
rustPlatform.buildRustPackage rec {
pname = "jrsonnet";
- version = "5f0f8de9f52f961e2ff162e0a3fd4ca20a275f1d";
+ version = "d32fe45b8ed28fb39b5359a704922922368af1c0";
src = fetchFromGitHub {
owner = "CertainLach";
repo = pname;
rev = version;
- hash = lib.fakeHash;
+ hash = "sha256-R9Xt36bYS5upVDzt8hEifwmfocXpJbIKwvxkoJNEGVc=";
};
+ cargoHash = "sha256-V+KGWeNlUnelofaGzufNPLGDyxazoFrjZ/n391VYYws=";
cargoTestFlags = [ "--package=jrsonnet --features=mimalloc,legacy-this-file" ];
cargoBuildFlags = [ "--package=jrsonnet --features=mimalloc,legacy-this-file" ];
nix/jrsonnet.nixdiffbeforeafterboth--- a/nix/jrsonnet.nix
+++ b/nix/jrsonnet.nix
@@ -20,8 +20,8 @@
pname = "jrsonnet";
version = "git";
- cargoTestFlags = [ "--package=jrsonnet --features=mimalloc,legacy-this-file" ];
- cargoBuildFlags = [ "--package=jrsonnet --features=mimalloc,legacy-this-file" ];
+ cargoTestFlags = [ "--features=mimalloc,legacy-this-file,nightly" ];
+ cargoBuildFlags = [ "--features=mimalloc,legacy-this-file,nightly" ];
buildInputs = [ makeWrapper ];