.maintainer-scripts/benchmark.sh
#!/bin/bash

set -e

BENCHMARKS=$1
if [ -z "$BENCHMARKS" ]; then
    BENCHMARKS="extract,mkdwarfs"
fi

HF=hyperfine
NPROC=$(nproc)

NWARM=2
NFAST=10
NSLOW=5

ARCH=$(ls -d1 dwarfs-*-Linux-*/ | head -n1)
HASH=$ARCH
ARCH=${ARCH/*-Linux-/}
ARCH=${ARCH/-*/}
HASH=${HASH/-Linux-*/}
HASH=${HASH/*-/}

OUT=reports-$HASH

mkdir -p $OUT

for i in dwarfs-*-Linux-*/; do
    t=${i/*-Linux-/}
    t=${t/\//}

    for n in mkdwarfs dwarfs dwarfsck dwarfsextract; do
        ln -sf ${i}*bin/$n $n-$t
    done
done

DATASETS='audio disk perl video'

MKDWARFS=$(ls -1 ./mkdwarfs-$ARCH-* | paste -sd "," -)
# DWARFSCK=$(ls -1 ./dwarfsck-$ARCH-* | paste -sd "," -)
DWARFSEXTRACT=$(ls -1 ./dwarfsextract-$ARCH-* | paste -sd "," -)
# DWARFS=$(ls -1 ./dwarfs-$ARCH-* | paste -sd "," -)

#############################################
# extract all datasets as TAR archive
#############################################

if [[ ",$BENCHMARKS," == *,extract,* ]]; then
    for ds in $DATASETS; do
        $HF --export-json=$OUT/extract-$ds.json --export-markdown $OUT/extract-$ds.md -w $NWARM -m $NFAST \
            -L bin "$DWARFSEXTRACT" "{bin} -n $NPROC -s 2g -i datasets/$ds.dwarfs -o /dev/null -f gnutar"
    done
fi

#############################################
# build filesystem images
#############################################

declare -A MKDWARFS_ARGS
MKDWARFS_ARGS[audio]="-C zstd:level=5 --categorize -C pcmaudio/waveform::flac:level=1"
MKDWARFS_ARGS[disk]="-C zstd:level=5 --categorize=incompressible --incompressible-fragments --incompressible-block-size=512k --order=revpath -B16 -C incompressible::null"
MKDWARFS_ARGS[perl]="-C zstd:level=5"
MKDWARFS_ARGS[video]="-C null -S 28 -B 3 -W 8 -w 0 --order=revpath"

if [[ ",$BENCHMARKS," == *,mkdwarfs,* ]]; then
    for ds in $DATASETS; do
        if [ ! -d tmp/$ds ]; then
            mkdir -p tmp/$ds
            echo "Extracting $ds dataset..."
            ./dwarfsextract-*-clang -n $NPROC -s 2g -i datasets/$ds.dwarfs -o tmp/$ds
        fi

        $HF --export-json=$OUT/mkdwarfs-$ds.json --export-markdown $OUT/mkdwarfs-$ds.md -w $NWARM -m $NSLOW \
            -L bin "$MKDWARFS" "{bin} -i tmp/$ds -o /dev/null --force --no-progress --log-level=warn ${MKDWARFS_ARGS[$ds]}"
    done
fi

# remove symlinks

for n in mkdwarfs dwarfs dwarfsck dwarfsextract; do
    for l in $n-$ARCH-*; do
        if [ -L $l ]; then
            rm -f $l
        fi
    done
done
