diff options
Diffstat (limited to 'third_party/lisp/mime4cl/benchmark/default.nix')
-rw-r--r-- | third_party/lisp/mime4cl/benchmark/default.nix | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/third_party/lisp/mime4cl/benchmark/default.nix b/third_party/lisp/mime4cl/benchmark/default.nix new file mode 100644 index 000000000000..b201ede740b4 --- /dev/null +++ b/third_party/lisp/mime4cl/benchmark/default.nix @@ -0,0 +1,69 @@ +{ depot, pkgs, lib, ... }: + +let + # Example email that's going to push the parser due to its big attachment + # of almost 200MB. We are using a GHC bindist since it's quite big and a + # fixed output derivation that's already part of nixpkgs, so whitby only + # needs to download it once (and it won't change). + message = pkgs.runCommand "huge.mime" + { + nativeBuildInputs = [ pkgs.buildPackages.mblaze ]; + } + '' + mmime > $out <<EOF + Subject: Test message with a big attachment + + Henlo world! + + #application/gzip#base64 ${pkgs.haskell.compiler.ghc963Binary.src} + EOF + ''; + + inherit (depot.nix) buildLisp getBins; + + benchmark-program = buildLisp.program { + name = "mime4cl-benchmark-program"; + + deps = [ + { + sbcl = buildLisp.bundled "uiop"; + default = buildLisp.bundled "asdf"; + } + depot.third_party.lisp.mime4cl + ]; + + srcs = [ + ./bench.lisp + ]; + + main = "mime4cl-bench:main"; + }; + + commands = bench: { + mime4cl-message-parsing = "${bench} parse ${message}"; + mime4cl-attachment-extraction = "${bench} extract ${message}"; + }; + + # TODO(sterni): expose this information from //nix/buildLisp and generate automatically + lispImplementations = [ "sbcl" /* "ccl" "ecl" */ ]; +in + +(pkgs.writeShellScriptBin "mime4cl-benchmark" '' + exec ${pkgs.hyperfine}/bin/hyperfine \ + ${ + lib.escapeShellArgs ( + lib.concatMap (impl: + lib.concatLists ( + lib.mapAttrsToList (name: cmd: + [ "-n" "${impl}-${name}" cmd ] + ) (commands (let b = benchmark-program.${impl}; in "${b}/bin/${b.name}")) + ) + ) lispImplementations + ) + } \ + "$@" +'').overrideAttrs (oldAttrs: { + passthru = oldAttrs.passthru or { } // { + inherit benchmark-program; + }; +}) |