#!/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