Files
FreeCADWasmDev/tools/benchmark_acceptance_loading.py

74 lines
3.4 KiB
Python

#!/usr/bin/env python3
"""Measure evidence reads without running cases or changing acceptance status."""
import argparse
import json
import time
from datetime import datetime, timezone
from unittest.mock import patch
import business_acceptance as evidence
import run_business_acceptance as runner
from business_batching import module_batches
def measure(module, grouped):
evidence.digest.cache_clear()
evidence.module_inputs.cache_clear()
rows = [row for row in evidence.requirements() if row["module"] == module]
contract_path = evidence.ROOT / f"docs/business-acceptance/{module}.json"
contract = evidence.read(contract_path)
command = contract["command"]
counts = {"jsonReads": 0, "evidenceReads": 0, "ledgerReads": 0}
original_read = evidence.read
def read(path):
counts["jsonReads"] += 1
counts["evidenceReads"] += int("business-evidence" in path.parts)
counts["ledgerReads"] += int(path == evidence.LEDGER)
return original_read(path)
started = time.perf_counter()
with patch.object(evidence, "read", side_effect=read), patch.object(runner, "read", side_effect=read):
inputs = runner.case_inputs(contract_path, command, contract.get("dependencies", []))
verified = evidence.accepted_ids(rows)
entries = read(evidence.LEDGER).get("records", {}) if grouped else None
reports = {} if grouped else None
reusable = []
for row in rows:
if row["id"] not in verified:
continue
proofs = runner.reusable_reports([row], command, inputs, {}, {},
**({"verified_ids": verified, "entries": entries, "reports": reports} if grouped else {}))
if proofs:
reusable.append(row["id"])
return {**counts, "seconds": round(time.perf_counter() - started, 6),
"currentPassed": len(verified), "reusableIds": sorted(reusable),
"hashCache": evidence.digest.cache_info()._asdict()}
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--module", default="Points")
args = parser.parse_args()
baseline = measure(args.module, False)
optimized = measure(args.module, True)
if baseline["reusableIds"] != optimized["reusableIds"]:
raise AssertionError("Optimization changed evidence reuse decisions")
batching = []
for file in sorted((evidence.ROOT / "docs/business-acceptance").glob("*.json")):
contract = evidence.read(file)
ids = contract.get("coveredIds", [])
batching.append({"module": file.stem, "ids": len(ids), "previousBatches": (len(ids)+7)//8,
"sharedOwnerBatches": len(list(module_batches(ids, contract)))})
report = {"generatedAt": datetime.now(timezone.utc).isoformat(), "module": args.module,
"scope": "Same-machine metadata/evidence benchmark, not browser/WASM compute throughput",
"baselinePerId": baseline, "optimizedSharedReports": optimized, "batchPlan": batching,
"sameReuseDecisions": True,
"previousBatches": sum(row["previousBatches"] for row in batching),
"sharedOwnerBatches": sum(row["sharedOwnerBatches"] for row in batching)}
path = evidence.ROOT / "docs/current/acceptance-loading-benchmark.json"
path.write_text(json.dumps(report, indent=2) + "\n")
print(json.dumps(report))
if __name__ == "__main__":
main()