74 lines
3.4 KiB
Python
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()
|