Sub-millisecond runs showed as a flat 0ms, hiding real differences. The suite now times fastwc with a time_us helper, keeps the minimum reading in µs, derives ms from it, and prints both (fastwc: 0ms (767µs)). GNU wc stays at ms precision; solo case shows µs too.
41 lines
1.3 KiB
Bash
Executable File
41 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# bench.sh — race fastwc against GNU coreutils wc on standard input, fed by
|
|
# shell redirect (the same path every real pipeline uses). Counts must agree
|
|
# with coreutils' stdin behavior, and fastwc must not be slower.
|
|
# Fails fast: the moment fastwc is slower than (or disagrees with) coreutils
|
|
# 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
|
|
BENCH_NAME="coreutils"
|
|
|
|
printf 'benchmarking %s wc vs fastwc: stdin (%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' '--- stdin lines ---'
|
|
if ! run_stdin_cases lines -l 10000 100000 1000000 10000000; then
|
|
exit 1
|
|
fi
|
|
|
|
printf '%s\n' '--- stdin words ---'
|
|
if ! run_stdin_cases words -w 1000 100000 1000000; then
|
|
exit 1
|
|
fi
|
|
|
|
printf '%s\n' '--- stdin lines+words+bytes ---'
|
|
if ! run_stdin_cases lines -lwc 1000000; then
|
|
exit 1
|
|
fi
|
|
|
|
printf '\nall %s stdin benchmarks passed — fastwc was never slower than %s wc\n' \
|
|
"$BENCH_NAME" "$BENCH_NAME"
|