--- 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 { --- a/nix/benchmarks.nix +++ b/nix/benchmarks.nix @@ -5,11 +5,13 @@ , stdenv , fetchFromGitHub , jrsonnet +, jrsonnet-release , go-jsonnet , sjsonnet , jsonnet , hyperfine , quick ? false +, againstRelease ? false }: let jsonnetBench = fetchFromGitHub { @@ -53,7 +55,9 @@ ${jsonnet-bundler}/bin/jb install ''; - skipSlow = if quick then "slow benchmark" else ""; + # Removes outsiders from the output + # Useful when comparing performance of different jrsonnet releases + skipSlow = if quick then "slow benchmark, but only quick requested" else ""; in stdenv.mkDerivation { name = "benchmarks"; @@ -67,7 +71,7 @@ jsonnet hyperfine - ]; + ] ++ (if againstRelease then [ jrsonnet-release ] else [ ]); installPhase = let @@ -89,23 +93,26 @@ echo "> Note: No results for C++, ${skipCpp}" >> $out echo >> $out '' else ""} - echo "
" >> $out - echo "Source" >> $out - echo >> $out - echo "\`\`\`jsonnet" >> $out - ${if pathIsGenerator then "echo \"// Generator source\" >> $out" else ""} - ${if omitSource then "echo \"// Omitted: too large\" >> $out" else "cat ${path} >> $out"} - echo >> $out - echo "\`\`\`" >> $out - echo "
" >> $out - echo >> $out + ${if !quick then '' + echo "
" >> $out + echo "Source" >> $out + echo >> $out + echo "\`\`\`jsonnet" >> $out + ${if pathIsGenerator then "echo \"// Generator source\" >> $out" else ""} + ${if omitSource then "echo \"// Omitted: too large\" >> $out" else "cat ${path} >> $out"} + echo >> $out + echo "\`\`\`" >> $out + echo "
" >> $out + echo >> $out + '' else ""} path=${path} ${if pathIsGenerator then '' jrsonnet $path > generated.jsonnet path=generated.jsonnet '' else ""} - hyperfine -N ${if quick then "-r1" else ""} --output=pipe --style=basic --export-markdown result.md \ + hyperfine -N -w4 --output=pipe --style=basic --export-markdown result.md \ "jrsonnet $path ${if vendor != "" then "-J${vendor}" else ""}" -n "Rust" \ + ${if againstRelease then "\"jrsonnet-release $path ${if vendor != "" then "-J${vendor}" else ""}\" -n \"Rust (released)\"" else "" } \ ${if skipGo == "" then "\"go-jsonnet $path ${if vendor != "" then "-J ${vendor}" else ""}\" -n \"Go\"" else "" } \ ${if skipScala == "" then "\"sjsonnet $path ${if vendor != "" then "-J ${vendor}" else ""}\" -n \"Scala\"" else "" } \ ${if skipCpp == "" then "\"jsonnet $path ${if vendor != "" then "-J ${vendor}" else ""}\" -n \"C++\"" else "" } @@ -114,40 +121,42 @@ in '' touch $out - cat ${./benchmarks.md} >> $out - echo >> $out + ${if !quick then '' + cat ${./benchmarks.md} >> $out + echo >> $out - echo "
" >> $out - echo "Tested versions" >> $out - echo >> $out - echo Rust: git as $(date +'%d.%m.%Y' -u) >> $out - echo >> $out - echo "\`\`\`" >> $out - jrsonnet --help >> $out - echo "\`\`\`" >> $out - echo >> $out - echo Go: $(go-jsonnet --version) >> $out - echo >> $out - echo "\`\`\`" >> $out - go-jsonnet --help >> $out - echo "\`\`\`" >> $out - echo >> $out - echo C++: $(jsonnet --version) >> $out - echo >> $out - echo "\`\`\`" >> $out - jsonnet --help >> $out - echo "\`\`\`" >> $out - echo >> $out - echo Scala: >> $out - echo >> $out - echo "\`\`\`" >> $out - sjsonnet 2>> $out || true - echo "\`\`\`" >> $out - echo >> $out - echo "
" >> $out - echo >> $out + echo "
" >> $out + echo "Tested versions" >> $out + echo >> $out + echo Rust: git as $(date +'%d.%m.%Y' -u) >> $out + echo >> $out + echo "\`\`\`" >> $out + jrsonnet --help >> $out + echo "\`\`\`" >> $out + echo >> $out + echo Go: $(go-jsonnet --version) >> $out + echo >> $out + echo "\`\`\`" >> $out + go-jsonnet --help >> $out + echo "\`\`\`" >> $out + echo >> $out + echo C++: $(jsonnet --version) >> $out + echo >> $out + echo "\`\`\`" >> $out + jsonnet --help >> $out + echo "\`\`\`" >> $out + echo >> $out + echo Scala: >> $out + echo >> $out + echo "\`\`\`" >> $out + sjsonnet 2>> $out || true + echo "\`\`\`" >> $out + echo >> $out + echo "
" >> $out + echo >> $out - echo >> $out + echo >> $out + '' else ""} echo "## Real world" >> $out ${mkBench {name = "Graalvm CI"; path = "${graalvmBench}/ci.jsonnet"; skipCpp = "takes longer than a hour";}} ${mkBench {name = "Kube-prometheus manifests"; vendor = "${kubePrometheusBench}/vendor"; path = "${kubePrometheusBench}/example.jsonnet"; skipCpp = skipSlow;}} --- 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" ]; --- 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 ];