litbwraw/benchmarks/bench.sh
2025-03-01 16:38:19 +01:00

121 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
if [ ! -d benches ]; then
echo "Benchmark sources not found, downloading..."
mkdir benches
curl -L -o benches/benchmarksgame-sourcecode.zip https://salsa.debian.org/benchmarksgame-team/benchmarksgame/-/raw/3889723f05b20fe9008d7c987f832fe5d5db5bf1/public/download/benchmarksgame-sourcecode.zip
unzip -d benches/ benches/benchmarksgame-sourcecode.zip
echo "Downloaded benchmark sources"
fi
if [ ! -d "fengari/node_modules" ]; then
echo "Node modules not pulled, pulling"
npm --prefix ./fengari install
echo "Node modules pulled"
fi
if [ ! -f "wasm/target/wasm32-unknown-emscripten/release/wasm.js" ]; then
echo "Wasm module not built, building it..."
cargo build --manifest-path ./wasm/Cargo.toml --release --target wasm32-unknown-emscripten
echo "Wasm module built"
fi
bench() {
target="$1"
file="$2"
args=${@:3}
secs=""
cpu_secs=""
mem=""
for _ in {1..5}; do
output=$(/usr/bin/time -f '%U %S %e %M' node "$target/main.js" "$(cat $file)" $args 2>&1> /dev/null)
if [ $? != 0 ]; then
echo "Benchmark exited unexpectedly: $output"
return 1;
fi
secs="${secs} $(echo "$output" | awk '{ print $1 + $2 }')"
cpu_secs="${cpu_secs} $(echo "$output" | awk '{ print $3 }')"
mem="${mem} $(echo "$output" | awk '{ print $4 }')"
done
mid_secs=$(echo "$secs" | awk '{ printf "%.3f", ($1 + $2 + $3 + $4 + $5) / 5 }')
mid_cpu_secs=$(echo "$cpu_secs" | awk '{ printf "%.3f", ($1 + $2 + $3 + $4 + $5) / 5 }')
mid_mem=$(echo "$mem" | awk '{ printf "%.0f", ($1 + $2 + $3 + $4 + $5) / 5 }')
echo "$mid_secs $mid_cpu_secs $mid_mem"
}
bench_and_print() {
name="$1"
directory="$2"
files="$3"
args=${@:4}
# "array" of <secs> <cpu secs> <mem> <target> [#num]
bench_results=""
for file in $files; do
num=$(echo $file | grep -oP '(?<=lua-)\d(?=.lua)')
for target in fengari wasm; do
result=$(bench "$target" "$directory/$file" $args)
if [ $? != 0 ]; then
echo "$result"
return 1;
fi
if [ -z "${num}" ]; then
bench_results="${bench_results}\n$result $target"
else
bench_results="${bench_results}\n$result $target $num"
fi
done
done
bench_results=$(printf "$bench_results" | sed 1d | sort -k1 -n)
best_bench_secs=$(printf "$bench_results" | head -1 | awk '{ print $1 }')
echo "#### $name"
echo "| x | source | secs | mem(kb) | cpu secs |"
echo "| - | ------ | ---- | --- | -------- |"
printf "$bench_results\n" | while read line; do
secs=$(echo "$line" | awk '{ print $1 }')
cpu_secs=$(echo "$line" | awk '{ print $2 }')
mem=$(echo "$line" | awk '{ print $3 }')
target=$(echo "$line" | awk '{ print $4 }')
number=$(echo "$line" | awk '{ print $5 }')
secs_ratio=$(echo "$secs $best_bench_secs" | awk '{ printf "%.3f\n", $1 / $2 }')
if [ -z "$number" ]; then
echo "| $secs_ratio | $target | $secs | $mem | $cpu_secs |"
else
echo "| $secs_ratio | $target #$number | $secs | $mem | $cpu_secs |"
fi
done
if [ -z "${args}" ]; then
echo "###### [$name](https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/$(basename $directory)) with default arguments"
else
echo "###### [$name](https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/$(basename $directory)) with argument(s): $args"
fi
}
echo "Starting benchmarks"
bench_and_print "binary-trees" benches/binarytrees "binarytrees.lua-2.lua" # binarytrees.lua-3.lua and binarytrees.lua-4.lua are using io.popen for multiprocessing
# bench_and_print "fannkuch-redux" benches/fannkuchredux "fannkuchredux.lua" # broken
bench_and_print "fasta" benches/fasta "fasta.lua-2.lua fasta.lua-3.lua"
# bench_and_print "knucleotide" benches/knucleotide "knucleotide.lua-2.lua" # needs to read from stdin
bench_and_print "mandelbrot" benches/mandelbrot "mandelbrot.lua mandelbrot.lua-2.lua mandelbrot.lua-3.lua" # mandelbrot.lua-6.lua is using io.popen for multiprocessing
bench_and_print "n-body" benches/nbody "nbody.lua nbody.lua-2.lua nbody.lua-4.lua"
# bench_and_print "nbody-inprocess" benches/nbodyinprocess "" # has no lua implementation
# bench_and_print "pidigits" benches/pidigits "pidigits.lua pidigits.lua-5.lua pidigits.lua-7.lua" # all need external 'c-gmp' module
# bench_and_print "regex-redux" benches/regexredux "regexredux.lua" # needs external 'rex_pcre2' module
# bench_and_print "reverse-complement" benches/revcomp "revcomp.lua-2.lua revcomp.lua-4.lua revcomp.lua-5.lua" # all need to read from stdin
bench_and_print "spectral-norm" benches/spectralnorm "spectralnorm.lua"
echo "Benchmarks finished"