Files
hakorune/tools/perf/dual_emit_compare.sh

67 lines
2.1 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# dual_emit_compare.sh — Dualemit MIR(JSON) (provider vs selfhost) and compare + bench
# Usage: tools/perf/dual_emit_compare.sh <input.hako> [rounds]
# Output: human summary + CSV snippets (provider/selfhost benches)
set -euo pipefail
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <input.hako> [rounds]" >&2
exit 2
fi
IN="$1"; ROUNDS="${2:-3}"
ROOT="$(cd "$(dirname "$0")"/../.. && pwd)"
EMIT="$ROOT/tools/hakorune_emit_mir.sh"
BENCH="$ROOT/tools/perf/bench_hakorune_emit_mir.sh"
CMP="$ROOT/tools/perf/compare_mir_json.sh"
for f in "$EMIT" "$BENCH" "$CMP"; do
[[ -x "$f" ]] || { echo "error: missing executable: $f" >&2; exit 2; }
done
[[ -f "$IN" ]] || { echo "error: input not found: $IN" >&2; exit 2; }
prov_csv=$(HAKO_SELFHOST_BUILDER_FIRST=0 "$BENCH" "$IN" "$ROUNDS" || true)
self_csv=$(HAKO_SELFHOST_BUILDER_FIRST=1 "$BENCH" "$IN" "$ROUNDS" || true)
calc_stats() {
# stdin: CSV header then rows: round,ms,size,sha1
awk -F, 'NR>1 && $2 ~ /^[0-9]+$/ { n++; s+=$2; arr[n]=$2 } END {
if (n==0) { print "count=0 avg=NA p50=NA"; exit }
asort(arr)
p50 = (n%2==1)? arr[(n+1)/2] : (arr[n/2]+arr[n/2+1])/2
printf("count=%d avg=%.0f p50=%.0f\n", n, (s/n), p50)
}'
}
prov_stats=$(printf '%s\n' "$prov_csv" | calc_stats)
self_stats=$(printf '%s\n' "$self_csv" | calc_stats)
OUT_PROV="/tmp/dual_mir_provider_$$.json"
OUT_SELF="/tmp/dual_mir_selfhost_$$.json"
trap 'rm -f "$OUT_PROV" "$OUT_SELF" || true' EXIT
# Produce concrete MIR JSONs
HAKO_SELFHOST_BUILDER_FIRST=0 "$EMIT" "$IN" "$OUT_PROV" >/dev/null 2>&1 || true
HAKO_SELFHOST_BUILDER_FIRST=1 "$EMIT" "$IN" "$OUT_SELF" >/dev/null 2>&1 || true
echo "== DualEmit Bench Summary =="
echo "input: $IN rounds: $ROUNDS"
echo "provider: $prov_stats"
echo "selfhost: $self_stats"
if [[ -s "$OUT_PROV" && -s "$OUT_SELF" ]]; then
echo "\n== Structural Compare (normalized) =="
"$CMP" "$OUT_PROV" "$OUT_SELF" || true
else
echo "\n[warn] one or both MIR outputs missing. Check bench CSV for ERROR rows." >&2
fi
echo "\n== Provider CSV =="
printf '%s\n' "$prov_csv" | sed -n '1,20p'
echo "\n== Selfhost CSV =="
printf '%s\n' "$self_csv" | sed -n '1,20p'
exit 0