Busybox wc is back in every suite, for shits and giggles. checkwc now walks PATH and identifies each wc by its --version answer (coreutils and fastwc respond; busybox names itself in the error it prints), so a wc symlinked to fastwc is detected and skipped instead of silently racing us against ourselves, and a missing coreutils is a clear configure error. Every run now ends with the average speedup of fastwc against coreutils and busybox, computed from the per-case ratios. The fail-fast verdict now requires a measurable (>0ms) reference time, so sub-millisecond cases stop flaking on startup noise, and the 100M line monster is pinned back to the coreutils oracle instead of whatever oracle was raced last.
47 lines
1.6 KiB
Bash
Executable File
47 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# bench.sh — race fastwc against GNU coreutils wc on line counts, file input.
|
|
# Busybox wc is raced too, for shits and giggles. Includes the monster
|
|
# cases: 100M lines raced against coreutils (busybox through 1.1 GB is a
|
|
# spectator sport, not a benchmark), and 1B lines timed solo (no
|
|
# reference to beat — there isn't one).
|
|
# Fails fast: the moment fastwc is slower than (or disagrees with) an
|
|
# oracle wc, a human readable report is written to FAILED-benchmark.txt
|
|
# and this script exits non-zero.
|
|
#
|
|
# usage: ./bench.sh
|
|
set -u
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_DIR="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
|
source "$REPO_DIR/benchmarks/std.sh"
|
|
|
|
checkfastwc
|
|
checkwc
|
|
|
|
for oracle in $ORACLES; do
|
|
select_oracle "$oracle" || exit 1
|
|
|
|
printf 'benchmarking %s wc vs fastwc: lines, file input (%s interleaved runs each, minimum kept)\n' \
|
|
"$BENCH_NAME" "$BENCH_REPS"
|
|
printf '%-28s %10s %22s %8s %s\n' 'test' 'wc' 'fastwc (ms µs)' 'ratio' 'status'
|
|
|
|
printf '%s\n' '--- lines ---'
|
|
if ! run_cases lines -l 10000 100000 1000000 10000000; then
|
|
exit 1
|
|
fi
|
|
|
|
printf '\nall %s lines benchmarks passed — fastwc was never slower than %s wc\n' \
|
|
"$BENCH_NAME" "$BENCH_NAME"
|
|
done
|
|
|
|
# The monsters stay coreutils-only (busybox through 1.1 GB is a spectator
|
|
# sport, not a benchmark), so switch back from the last oracle raced.
|
|
select_oracle coreutils || exit 1
|
|
printf '%s\n' '--- monster: 100M lines vs coreutils ---'
|
|
if ! run_cases lines -l 100000000; then
|
|
exit 1
|
|
fi
|
|
|
|
printf '%s\n' '--- monster: 1B lines, solo ---'
|
|
run_solo_case 1000000000 -l
|