about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tvix/cli/default.nix62
1 files changed, 61 insertions, 1 deletions
diff --git a/tvix/cli/default.nix b/tvix/cli/default.nix
index 0b73fa1aa59e..4c4980be76a7 100644
--- a/tvix/cli/default.nix
+++ b/tvix/cli/default.nix
@@ -18,11 +18,67 @@ let
       echo "Output was correct."
     '';
   };
+
+  benchmark-gnutime-format-string =
+    description:
+    "Benchmark: " +
+    (builtins.toJSON {
+      "${description}" = {
+        kbytes = "%M";
+        system = "%S";
+        user = "%U";
+      };
+    });
+
 in
 
 (depot.tvix.crates.workspaceMembers.tvix-cli.build.override {
   runTests = true;
-}).overrideAttrs (_: {
+}).overrideAttrs (finalAttrs: previousAttrs:
+
+let
+  tvix-cli = finalAttrs.finalPackage;
+
+  # You can run the benchmark with a simple `nix run`, like:
+  #
+  #  nix run -f . tvix.cli.meta.ci.extraSteps.benchmark-nixpkgs-cross-hello-outpath
+  #
+  # TODO(amjoseph): store these results someplace more durable, like git trailers
+  #
+  mkExprBenchmark = { expr, description }:
+    let name = "tvix-cli-benchmark-${description}"; in
+    (pkgs.writeShellScriptBin name ''
+      ${lib.escapeShellArgs [
+        "${pkgs.time}/bin/time"
+        "--format" "${benchmark-gnutime-format-string description}"
+        "${tvix-cli}/bin/tvix"
+        "--no-warnings"
+        "-E" expr
+      ]}
+    '').overrideAttrs (finalAttrs: previousAttrs: {
+      passthru = (previousAttrs.passthru or { }) // {
+        ci = {
+          label = ":nix: benchmark ${description} in tvix";
+          needsOutput = true;
+          command = "${finalAttrs.finalPackage}/bin/${finalAttrs.meta.mainProgram}";
+        };
+      };
+    });
+
+  mkNixpkgsBenchmark = attrpath:
+    mkExprBenchmark {
+      description = builtins.replaceStrings [ ".drv" ] [ "-drv" ] attrpath;
+      expr = "(import ${pkgs.path} {}).${attrpath}";
+    };
+
+  benchmarks = {
+    benchmark-hello = (mkNixpkgsBenchmark "hello.outPath");
+    benchmark-cross-hello = (mkNixpkgsBenchmark "pkgsCross.aarch64-multiplatform.hello.outPath");
+    benchmark-firefox = (mkNixpkgsBenchmark "firefox.outPath");
+    benchmark-cross-firefox = (mkNixpkgsBenchmark "pkgsCross.aarch64-multiplatform.firefox.outPath");
+  };
+in
+{
   meta = {
     ci.extraSteps = {
       eval-nixpkgs-stdenv-drvpath = (mkNixpkgsEvalCheck "stdenv.drvPath" pkgs.stdenv.drvPath);
@@ -31,5 +87,9 @@ in
       eval-nixpkgs-cross-stdenv-outpath = (mkNixpkgsEvalCheck "pkgsCross.aarch64-multiplatform.stdenv.outPath" pkgs.pkgsCross.aarch64-multiplatform.stdenv.outPath);
       eval-nixpkgs-cross-hello-outpath = (mkNixpkgsEvalCheck "pkgsCross.aarch64-multiplatform.hello.outPath" pkgs.pkgsCross.aarch64-multiplatform.hello.outPath);
     };
+    ci.targets = builtins.attrNames benchmarks;
   };
+
+  # Expose benchmarks as standard CI targets.
+  passthru = benchmarks;
 })