diff options
author | Silvan Mosberger <silvan.mosberger@tweag.io> | 2023-09-14 22:14:06 +0200 |
---|---|---|
committer | Silvan Mosberger <silvan.mosberger@tweag.io> | 2023-09-21 00:21:01 +0200 |
commit | 631ad2169243e656cb622365e76ee480bb6a3419 (patch) | |
tree | 5e62904787f828580872e1d8ffef2a84797693a0 /lib/fileset | |
parent | 7ab764e575135586cb8ac496702663a40a2bfa56 (diff) |
lib.fileset: More reusable benchmark code
Diffstat (limited to 'lib/fileset')
-rwxr-xr-x | lib/fileset/benchmark.sh | 101 |
1 files changed, 55 insertions, 46 deletions
diff --git a/lib/fileset/benchmark.sh b/lib/fileset/benchmark.sh index f72686c4ab3fa..b68d2fcefe902 100755 --- a/lib/fileset/benchmark.sh +++ b/lib/fileset/benchmark.sh @@ -28,38 +28,6 @@ work="$tmp/work" mkdir "$work" cd "$work" -# Create a fairly populated tree -touch f{0..5} -mkdir d{0..5} -mkdir e{0..5} -touch d{0..5}/f{0..5} -mkdir -p d{0..5}/d{0..5} -mkdir -p e{0..5}/e{0..5} -touch d{0..5}/d{0..5}/f{0..5} -mkdir -p d{0..5}/d{0..5}/d{0..5} -mkdir -p e{0..5}/e{0..5}/e{0..5} -touch d{0..5}/d{0..5}/d{0..5}/f{0..5} -mkdir -p d{0..5}/d{0..5}/d{0..5}/d{0..5} -mkdir -p e{0..5}/e{0..5}/e{0..5}/e{0..5} -touch d{0..5}/d{0..5}/d{0..5}/d{0..5}/f{0..5} - -bench() { - NIX_PATH=nixpkgs=$1 NIX_SHOW_STATS=1 NIX_SHOW_STATS_PATH=$tmp/stats.json \ - nix-instantiate --eval --strict --show-trace >/dev/null \ - --expr '(import <nixpkgs/lib>).fileset.toSource { root = ./.; fileset = ./.; }' - cat "$tmp/stats.json" -} - -echo "Running benchmark on index" >&2 -bench "$nixpkgs" > "$tmp/new.json" -( - echo "Checking out $compareTo" >&2 - git -C "$nixpkgs" worktree add --quiet "$tmp/worktree" "$compareTo" - trap 'git -C "$nixpkgs" worktree remove "$tmp/worktree"' EXIT - echo "Running benchmark on $compareTo" >&2 - bench "$tmp/worktree" > "$tmp/old.json" -) - declare -a stats=( ".envs.elements" ".envs.number" @@ -77,18 +45,59 @@ declare -a stats=( ".values.number" ) -different=0 -for stat in "${stats[@]}"; do - oldValue=$(jq "$stat" "$tmp/old.json") - newValue=$(jq "$stat" "$tmp/new.json") - if (( oldValue != newValue )); then - percent=$(bc <<< "scale=100; result = 100/$oldValue*$newValue; scale=4; result / 1") - if (( oldValue < newValue )); then - echo -e "Statistic $stat ($newValue) is \e[0;31m$percent% (+$(( newValue - oldValue )))\e[0m of the old value $oldValue" >&2 - else - echo -e "Statistic $stat ($newValue) is \e[0;32m$percent% (-$(( oldValue - newValue )))\e[0m of the old value $oldValue" >&2 +# TODO: Measure time +run() { + NIX_PATH=nixpkgs=$1 NIX_SHOW_STATS=1 NIX_SHOW_STATS_PATH=$tmp/stats.json \ + nix-instantiate --eval --strict --show-trace >/dev/null \ + --expr 'with import <nixpkgs/lib>; with fileset; '"$2" + cat "$tmp/stats.json" +} + +bench() { + echo "Benchmarking expression $1" >&2 + #echo "Running benchmark on index" >&2 + run "$nixpkgs" "$1" > "$tmp/new.json" + ( + #echo "Checking out $compareTo" >&2 + git -C "$nixpkgs" worktree add --quiet "$tmp/worktree" "$compareTo" + trap 'git -C "$nixpkgs" worktree remove "$tmp/worktree"' EXIT + #echo "Running benchmark on $compareTo" >&2 + run "$tmp/worktree" "$1" > "$tmp/old.json" + ) + + different=0 + for stat in "${stats[@]}"; do + oldValue=$(jq "$stat" "$tmp/old.json") + newValue=$(jq "$stat" "$tmp/new.json") + if (( oldValue != newValue )); then + percent=$(bc <<< "scale=100; result = 100/$oldValue*$newValue; scale=4; result / 1") + if (( oldValue < newValue )); then + echo -e "Statistic $stat ($newValue) is \e[0;31m$percent% (+$(( newValue - oldValue )))\e[0m of the old value $oldValue" >&2 + else + echo -e "Statistic $stat ($newValue) is \e[0;32m$percent% (-$(( oldValue - newValue )))\e[0m of the old value $oldValue" >&2 + fi + (( different++ )) || true fi - (( different++ )) || true - fi -done -echo "$different stats differ between the current tree and $compareTo" + done + echo "$different stats differ between the current tree and $compareTo" + echo "" +} + +# Create a fairly populated tree +touch f{0..5} +mkdir d{0..5} +mkdir e{0..5} +touch d{0..5}/f{0..5} +mkdir -p d{0..5}/d{0..5} +mkdir -p e{0..5}/e{0..5} +touch d{0..5}/d{0..5}/f{0..5} +mkdir -p d{0..5}/d{0..5}/d{0..5} +mkdir -p e{0..5}/e{0..5}/e{0..5} +touch d{0..5}/d{0..5}/d{0..5}/f{0..5} +mkdir -p d{0..5}/d{0..5}/d{0..5}/d{0..5} +mkdir -p e{0..5}/e{0..5}/e{0..5}/e{0..5} +touch d{0..5}/d{0..5}/d{0..5}/d{0..5}/f{0..5} + +bench 'toSource { root = ./.; fileset = ./.; }' + +rm -rf -- * |