diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2023-11-02 11:53:50 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2023-11-02 12:16:12 -0400 |
commit | 5fb1ed2d9803bfa5eefdc49ae232f9ea4afff018 (patch) | |
tree | 5e18e6be6687d2fdb39b004f7b2fd75edc361783 | |
parent | 1cfa66a4268a4eefea29f207baaefd76d7792027 (diff) | |
download | bfs-5fb1ed2d9803bfa5eefdc49ae232f9ea4afff018.tar.xz |
bench: New -exec benchmarks
-rw-r--r-- | bench/bench.sh | 92 |
1 files changed, 89 insertions, 3 deletions
diff --git a/bench/bench.sh b/bench/bench.sh index b1d52bb..3436b19 100644 --- a/bench/bench.sh +++ b/bench/bench.sh @@ -20,10 +20,11 @@ EARLY_QUIT_DEFAULT=(chromium) PRINT_DEFAULT=(linux) STRATEGIES_DEFAULT=(rust) JOBS_DEFAULT=(rust) +EXEC_DEFAULT=(linux) usage() { - printf 'Usage: tailfin run %s [--default]\n' "${BASH_SOURCE[0]}" - printf ' [--complete] [--early-quit] [--print] [--strategies]\n' + printf 'Usage: tailfin run %s\n' "${BASH_SOURCE[0]}" + printf ' [--default] [--<BENCHMARK> [--<BENCHMARK>...]]\n' printf ' [--build=...] [--bfs] [--find] [--fd]\n' printf ' [--no-clean] [--help]\n\n' @@ -50,6 +51,10 @@ usage() { printf ' Parallelism benchmark.\n' printf ' Default corpus is --jobs=%s\n\n' "${JOBS_DEFAULT[*]}" + printf ' --exec[=CORPUS]\n' + printf ' Process spawning benchmark.\n' + printf ' Default corpus is --exec=%s\n\n' "${EXEC_DEFAULT[*]}" + printf ' --build=COMMIT\n' printf ' Build this bfs commit and benchmark it. Specify multiple times to\n' printf ' compare, e.g. --build=3.0.1 --build=3.0.2\n\n' @@ -109,6 +114,7 @@ setup() { PRINT=() STRATEGIES=() JOBS=() + EXEC=() for arg; do case "$arg" in @@ -171,12 +177,19 @@ setup() { --jobs=*) read -ra JOBS <<<"${arg#*=}" ;; + --exec) + EXEC=("${EXEC_DEFAULT[@]}") + ;; + --exec=*) + read -ra EXEC <<<"${arg#*=}" + ;; --default) COMPLETE=("${COMPLETE_DEFAULT[@]}") EARLY_QUIT=("${EARLY_QUIT_DEFAULT[@]}") PRINT=("${PRINT_DEFAULT[@]}") STRATEGIES=("${STRATEGIES_DEFAULT[@]}") JOBS=("${JOBS_DEFAULT[@]}") + EXEC=("${EXEC_DEFAULT[@]}") ;; --help) usage @@ -200,7 +213,7 @@ setup() { as-user mkdir -p bench/corpus declare -A cloned=() - for corpus in "${COMPLETE[@]}" "${EARLY_QUIT[@]}" "${PRINT[@]}" "${STRATEGIES[@]}" "${JOBS[@]}"; do + for corpus in "${COMPLETE[@]}" "${EARLY_QUIT[@]}" "${PRINT[@]}" "${STRATEGIES[@]}" "${JOBS[@]}" "${EXEC[@]}"; do if ((cloned["$corpus"])); then continue fi @@ -254,6 +267,7 @@ setup() { export_array PRINT export_array STRATEGIES export_array JOBS + export_array EXEC if ((UID == 0)); then turbo-off @@ -518,6 +532,76 @@ bench-jobs() { fi } +# One file/process +bench-exec-single() { + subsubgroup "One file per process" + + cmds=() + for cmd in "${BFS[@]}" "${FIND[@]}"; do + cmds+=("$cmd $1 -maxdepth 2 -exec true -- {} \;") + done + + for fd in "${FD[@]}"; do + cmds+=("$fd -u --search-path $1 --max-depth=2 -x true --") + # Without -j1, fd runs multiple processes in parallel, which is unfair + cmds+=("$fd -j1 -u --search-path $1 --max-depth=2 -x true --") + done + + do-hyperfine "${cmds[@]}" +} + +# Many files/process +bench-exec-multi() { + subsubgroup "Many files per process" + + cmds=() + for cmd in "${BFS[@]}" "${FIND[@]}"; do + cmds+=("$cmd $1 -exec true -- {} +") + done + + for fd in "${FD[@]}"; do + cmds+=("$fd -u --search-path $1 -X true --") + done + + do-hyperfine "${cmds[@]}" +} + +# Many files, same dir +bench-exec-chdir() { + if ((${#BFS[@]} + ${#FIND[@]} == 0)); then + return + fi + + subsubgroup "Spawn in parent directory" + + cmds=() + for cmd in "${BFS[@]}" "${FIND[@]}"; do + cmds+=("$cmd $1 -maxdepth 3 -execdir true -- {} +") + done + + do-hyperfine "${cmds[@]}" +} + +# Benchmark process spawning +bench-exec-corpus() { + subgroup '%s' "$1" + + bench-exec-single "$2" + bench-exec-multi "$2" + bench-exec-chdir "$2" +} + +# All process spawning benchmarks +bench-exec() { + if (($#)); then + group "Process spawning" + + for corpus; do + bench-exec-corpus "$corpus ${TAGS[$corpus]}" "bench/corpus/$corpus" + done + fi +} + # Print benchmarked versions bench-versions() { subgroup "Versions" @@ -564,11 +648,13 @@ bench() { import_array PRINT import_array STRATEGIES import_array JOBS + import_array EXEC bench-complete "${COMPLETE[@]}" bench-early-quit "${EARLY_QUIT[@]}" bench-print "${PRINT[@]}" bench-strategies "${STRATEGIES[@]}" bench-jobs "${JOBS[@]}" + bench-exec "${EXEC[@]}" bench-details } |