|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +N_RUNS="${1:-10}" |
| 5 | +PIPE="./zig-out/bin/pipe" |
| 6 | +FIB="samples/fibonacci.pipe" |
| 7 | +FIB_PY="samples/fibonacci.py" |
| 8 | + |
| 9 | +echo "==> Building pipe..." |
| 10 | +zig build |
| 11 | + |
| 12 | +echo "" |
| 13 | +echo "==> Verifying outputs match..." |
| 14 | +OUT_VM=$(${PIPE} "${FIB}") |
| 15 | +OUT_INTERP=$(${PIPE} --interp "${FIB}") |
| 16 | +OUT_PY=$(python3 "${FIB_PY}") |
| 17 | + |
| 18 | +if [[ "${OUT_VM}" != "${OUT_INTERP}" || "${OUT_VM}" != "${OUT_PY}" ]]; then |
| 19 | + echo "ERROR: outputs differ!" |
| 20 | + echo " VM: ${OUT_VM}" |
| 21 | + echo " interp: ${OUT_INTERP}" |
| 22 | + echo " python: ${OUT_PY}" |
| 23 | + exit 1 |
| 24 | +fi |
| 25 | +echo "All three produce: ${OUT_VM}" |
| 26 | + |
| 27 | +echo "" |
| 28 | +if command -v hyperfine &>/dev/null; then |
| 29 | + echo "==> Benchmarking with hyperfine (${N_RUNS} runs each)..." |
| 30 | + hyperfine \ |
| 31 | + --runs "${N_RUNS}" \ |
| 32 | + --warmup 2 \ |
| 33 | + --export-markdown bench-results.md \ |
| 34 | + "${PIPE} ${FIB}" \ |
| 35 | + "${PIPE} --interp ${FIB}" \ |
| 36 | + "python3 ${FIB_PY}" |
| 37 | + echo "" |
| 38 | + echo "Results saved to bench-results.md" |
| 39 | +else |
| 40 | + echo "==> hyperfine not found — falling back to manual timing (${N_RUNS} runs each)..." |
| 41 | + echo "" |
| 42 | + |
| 43 | + run_timed() { |
| 44 | + local label="$1"; shift |
| 45 | + local total=0 |
| 46 | + for i in $(seq 1 "${N_RUNS}"); do |
| 47 | + local t |
| 48 | + t=$(TIMEFORMAT='%R'; { time "$@" > /dev/null; } 2>&1) |
| 49 | + total=$(awk "BEGIN { print ${total} + ${t} }") |
| 50 | + done |
| 51 | + local avg |
| 52 | + avg=$(awk "BEGIN { printf \"%.3f\", ${total} / ${N_RUNS} }") |
| 53 | + printf " %-40s avg %ss over %s runs\n" "${label}" "${avg}" "${N_RUNS}" |
| 54 | + } |
| 55 | + |
| 56 | + run_timed "pipe VM (${FIB})" ${PIPE} "${FIB}" |
| 57 | + run_timed "pipe interp (${FIB})" ${PIPE} --interp "${FIB}" |
| 58 | + run_timed "python3 (${FIB_PY})" python3 "${FIB_PY}" |
| 59 | +fi |
0 commit comments