lac/benches/compare-flac.sh
Kamal Tufekcic 7862cb1d9d
All checks were successful
CI / lint (push) Successful in 5s
CI / fuzz-regression (push) Successful in 14s
CI / build (push) Successful in 4s
CI / test (push) Successful in 6m54s
CI / publish (push) Successful in 8s
initial commit
Signed-off-by: Kamal Tufekcic <kamal@lo.sh>
2026-04-23 14:58:32 +03:00

69 lines
2.6 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Wall-clock + compressed-size comparison between FLAC and LAC on the
# local corpus directory. Diagnostic only — not part of CI.
#
# Usage:
# benches/compare-flac.sh [corpus_dir]
#
# Output columns (tab-separated, stable for piping into column -t):
#
# file flac_ms flac_bytes [matching LAC line from `cargo test`]
#
# For the LAC side, run `cargo test --test corpus --release -- --nocapture`
# and correlate `lac_enc_ms` / `lac=<bytes>` values against the filenames
# printed here. Two separate invocations because automating the join is
# more fragile than eyeballing it for the six files the corpus contains.
set -euo pipefail
CORPUS_DIR="${1:-corpus}"
if ! command -v flac > /dev/null 2>&1; then
echo "flac CLI not found in PATH; install the flac package" >&2
exit 1
fi
if [[ ! -d "$CORPUS_DIR" ]]; then
echo "corpus directory not found: $CORPUS_DIR" >&2
exit 1
fi
# Header. Columns cover both FLAC modes — default (`-5`, what most
# production pipelines actually use) and `--best` (`-8`, the ceiling
# `tests/corpus.rs` asserts its ratios against). `column -t` on the
# output aligns to the printf format below.
printf "%-50s\t%12s\t%14s\t%12s\t%14s\n" \
"file" "flac_d_ms" "flac_d_bytes" "flac_b_ms" "flac_b_bytes"
# Shell globs are unordered across filesystems; sort for stable output.
shopt -s nullglob
files=("$CORPUS_DIR"/*.wav)
IFS=$'\n' files=($(sort <<< "${files[*]}"))
unset IFS
# Warm-up invocation against the first file: the very first `flac` exec
# in a shell session pays dynamic-linker + page-fault costs that aren't
# representative of steady-state. Subsequent runs don't repay them.
if [[ ${#files[@]} -gt 0 ]]; then
flac --stdout --best --silent "${files[0]}" > /dev/null 2>&1 || true
fi
for f in "${files[@]}"; do
# `date +%s%N` gives nanoseconds since epoch on GNU coreutils. Not
# portable to BSD `date`, but this script is Linux-only by design
# (matches the CI runner environment).
#
# Two invocations per file: default (`-5`) first, then `--best`.
# Ordering is deliberate: the default pass also warms the OS file
# cache, so `--best` sees warm-cache I/O and its time reflects the
# compute cost, not disk read.
start_ns=$(date +%s%N)
flac_d_bytes=$(flac --stdout --silent "$f" 2> /dev/null | wc -c)
mid_ns=$(date +%s%N)
flac_b_bytes=$(flac --stdout --best --silent "$f" 2> /dev/null | wc -c)
end_ns=$(date +%s%N)
flac_d_ms=$(( (mid_ns - start_ns) / 1000000 ))
flac_b_ms=$(( (end_ns - mid_ns) / 1000000 ))
printf "%-50s\t%12d\t%14d\t%12d\t%14d\n" \
"$(basename "$f")" "$flac_d_ms" "$flac_d_bytes" "$flac_b_ms" "$flac_b_bytes"
done