Files
1jehuang--jcode/scripts/bench_selfdev_checkpoints.sh
T
wehub-resource-sync a789495a98
FreeBSD Smoke / FreeBSD Smoke (x86_64) (push) Has been cancelled
CI / Quality Guardrails (push) Has been cancelled
CI / Build & Test (macos-latest) (push) Has been cancelled
CI / Build & Test (ubuntu-latest) (push) Has been cancelled
CI / Build & Test (windows-latest) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / PowerShell Syntax (push) Has been cancelled
CI / Windows Cross-Target Check (Linux) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:10:34 +08:00

208 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
repo_root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
cd "$repo_root"
usage() {
cat <<'USAGE'
Usage:
scripts/bench_selfdev_checkpoints.sh [options]
Runs the standard compile checkpoints for the self-dev loop using scripts/bench_compile.sh.
Options:
--touch <path> Source file to touch for warm edit-loop runs (default: src/server.rs)
--runs <n> Number of warm runs per checkpoint (default: 3)
--skip-cold Skip cold checkpoints and only run warm edit-loop measurements
--json Print a single JSON object with all checkpoint summaries
-h, --help Show this help
Checkpoints:
cold_check cargo check after cargo clean
warm_check_edit touched-file cargo check loop
cold_selfdev_build selfdev jcode build after cargo clean
warm_selfdev_edit touched-file selfdev jcode build loop
USAGE
}
runs=3
touch_path="src/server.rs"
json_output=0
skip_cold=0
while [[ $# -gt 0 ]]; do
case "$1" in
--touch)
if [[ $# -lt 2 ]]; then
printf 'error: --touch requires a path\n' >&2
exit 1
fi
touch_path="$2"
shift
;;
--runs)
if [[ $# -lt 2 ]]; then
printf 'error: --runs requires a positive integer\n' >&2
exit 1
fi
runs="$2"
shift
;;
--json)
json_output=1
;;
--skip-cold)
skip_cold=1
;;
-h|--help)
usage
exit 0
;;
*)
printf 'error: unknown argument: %s\n' "$1" >&2
exit 1
;;
esac
shift
done
if ! [[ "$runs" =~ ^[1-9][0-9]*$ ]]; then
printf 'error: --runs must be a positive integer (got %s)\n' "$runs" >&2
exit 1
fi
if [[ ! -e "$touch_path" ]]; then
printf 'error: touch path does not exist: %s\n' "$touch_path" >&2
exit 1
fi
run_bench() {
local name="$1"
shift
local stdout_file stderr_file status
stdout_file=$(mktemp)
stderr_file=$(mktemp)
if scripts/bench_compile.sh "$@" --json >"$stdout_file" 2>"$stderr_file"; then
python3 - "$name" "$stdout_file" <<'PY'
import json
import pathlib
import sys
name = sys.argv[1]
payload = json.loads(pathlib.Path(sys.argv[2]).read_text())
payload["checkpoint"] = name
payload["ok"] = True
print(json.dumps(payload))
PY
else
status=$?
python3 - "$name" "$status" "$stderr_file" <<'PY'
import json
import pathlib
import sys
name = sys.argv[1]
status = int(sys.argv[2])
stderr = pathlib.Path(sys.argv[3]).read_text().strip()
print(json.dumps({
"checkpoint": name,
"ok": False,
"exit_code": status,
"error": stderr,
}))
PY
fi
rm -f "$stdout_file" "$stderr_file"
}
cold_check_json=$(python3 - <<'PY' "$skip_cold"
import json
import sys
skip = sys.argv[1] == "1"
print(json.dumps({"checkpoint": "cold_check", "ok": None, "skipped": skip}))
PY
)
cold_selfdev_json=$(python3 - <<'PY' "$skip_cold"
import json
import sys
skip = sys.argv[1] == "1"
print(json.dumps({"checkpoint": "cold_selfdev_build", "ok": None, "skipped": skip}))
PY
)
if [[ $skip_cold -eq 0 ]]; then
cold_check_json=$(run_bench cold_check check --cold)
cold_selfdev_json=$(run_bench cold_selfdev_build selfdev-jcode --cold)
fi
warm_check_json=$(run_bench warm_check_edit check --runs "$runs" --touch "$touch_path")
warm_selfdev_json=$(run_bench warm_selfdev_edit selfdev-jcode --runs "$runs" --touch "$touch_path")
summary_json=$(python3 - <<'PY' "$touch_path" "$runs" "$cold_check_json" "$warm_check_json" "$cold_selfdev_json" "$warm_selfdev_json"
import json
import sys
touch_path = sys.argv[1]
runs = int(sys.argv[2])
cold_check = json.loads(sys.argv[3])
warm_check = json.loads(sys.argv[4])
cold_selfdev = json.loads(sys.argv[5])
warm_selfdev = json.loads(sys.argv[6])
skip = bool(cold_check.get("skipped") and cold_selfdev.get("skipped"))
summary = {
"touch_path": touch_path,
"warm_runs": runs,
"skip_cold": skip == True,
"checkpoints": {
"cold_check": cold_check,
"warm_check_edit": warm_check,
"cold_selfdev_build": cold_selfdev,
"warm_selfdev_edit": warm_selfdev,
},
"failed_checkpoints": [
name for name, payload in {
"cold_check": cold_check,
"warm_check_edit": warm_check,
"cold_selfdev_build": cold_selfdev,
"warm_selfdev_edit": warm_selfdev,
}.items()
if payload.get("ok") is False
],
}
print(json.dumps(summary))
PY
)
if [[ $json_output -eq 1 ]]; then
printf '%s\n' "$summary_json"
else
python3 - <<'PY' "$summary_json"
import json
import sys
summary = json.loads(sys.argv[1])
print("selfdev compile checkpoints")
print(f" touch_path: {summary['touch_path']}")
print(f" warm_runs: {summary['warm_runs']}")
print(f" skip_cold: {summary['skip_cold']}")
for name, payload in summary["checkpoints"].items():
if payload.get("skipped"):
print(f" {name}: SKIPPED")
elif payload.get("ok", False):
print(
f" {name}: min={payload['min_seconds']:.3f}s "
f"median={payload['median_seconds']:.3f}s avg={payload['avg_seconds']:.3f}s "
f"max={payload['max_seconds']:.3f}s"
)
else:
print(
f" {name}: FAILED exit={payload.get('exit_code')} error={payload.get('error', '')[:160]}"
)
if summary["failed_checkpoints"]:
print(f" failed_checkpoints: {', '.join(summary['failed_checkpoints'])}")
PY
fi