aboutsummaryrefslogtreecommitdiff
path: root/bench/bench.sh
diff options
context:
space:
mode:
authorJade Lovelace <lix@jade.fyi>2024-04-07 18:24:03 -0700
committerJade Lovelace <lix@jade.fyi>2024-04-08 19:50:24 -0700
commitf4fc2b5d10c5bfab6d037e7c9c944d2277f70c58 (patch)
tree2eb3e6548771e595baa7d396a5a4672fadb4923a /bench/bench.sh
parent1e74bffd5c37bed52ef8547ffa2b4e7f895e4e2a (diff)
Add benchmarking scripts
These scripts were originally written by horrors, and have since been hacked up a lot by jade. We are putting them up as a CL since it is better to have checked in benchmarking scripts than to not have benchmarking scripts. cc: https://git.lix.systems/lix-project/lix/issues/23 Co-authored-by: eldritch horrors <pennae@lix.systems> Change-Id: I95c2f9d24753ac468944c5781deec9508fd5cb8c
Diffstat (limited to 'bench/bench.sh')
-rwxr-xr-xbench/bench.sh62
1 files changed, 62 insertions, 0 deletions
diff --git a/bench/bench.sh b/bench/bench.sh
new file mode 100755
index 000000000..70acd4640
--- /dev/null
+++ b/bench/bench.sh
@@ -0,0 +1,62 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+shopt -s inherit_errexit
+
+scriptdir=$(cd "$(dirname -- "$0")" ; pwd -P)
+cd "$scriptdir/.."
+
+if [[ $# -lt 2 ]]; then
+ # FIXME(jade): it is a reasonable use case to want to run a benchmark run
+ # on just one build. However, since we are using hyperfine in comparison
+ # mode, we would have to combine the JSON ourselves to support that, which
+ # would probably be better done by writing a benchmarking script in
+ # not-bash.
+ echo "Fewer than two result dirs given, nothing to compare!" >&2
+ echo "Pass some directories (with names indicating which alternative they are) with bin/nix in them" >&2
+ echo "Usage: ./bench/bench.sh result-1 result-2 [result-3...]" >&2
+ exit 1
+fi
+
+_exit=""
+trap "$_exit" EXIT
+
+# XXX: yes this is very silly. flakes~!!
+nix build --impure --expr '(builtins.getFlake "git+file:.").inputs.nixpkgs.outPath' -o bench/nixpkgs
+
+export NIX_REMOTE="$(mktemp -d)"
+_exit='rm -rfv "$NIX_REMOTE"; $_exit'
+export NIX_PATH="nixpkgs=bench/nixpkgs:nixos-config=bench/configuration.nix"
+
+builds=("$@")
+
+flake_args="--extra-experimental-features 'nix-command flakes'"
+
+hyperfineArgs=(
+ --parameter-list BUILD "$(IFS=,; echo "${builds[*]}")"
+ --warmup 2 --runs 10
+)
+
+declare -A cases
+cases=(
+ [search]="{BUILD}/bin/nix $flake_args search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19ccb59cac54b5b3f25e160870 hello"
+ [rebuild]="{BUILD}/bin/nix $flake_args eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'"
+ [rebuild-lh]="GC_INITIAL_HEAP_SIZE=10g {BUILD}/bin/nix eval $flake_args --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'"
+ [parse]="{BUILD}/bin/nix $flake_args eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix"
+)
+
+benches=(
+ rebuild
+ rebuild-lh
+ search
+ parse
+)
+
+for k in "${benches[@]}"; do
+ taskset -c 2,3 \
+ chrt -f 50 \
+ hyperfine "${hyperfineArgs[@]}" --export-json="bench/bench-${k}.json" --export-markdown="bench/bench-${k}.md" "${cases[$k]}"
+done
+
+echo "Benchmarks summary (from ./bench/summarize.jq bench/bench-*.json)"
+bench/summarize.jq bench/*.json