"""Длинный контроль 256 пакетов после JIT-прогрева, без SDR.""" from __future__ import annotations import argparse import json from pathlib import Path import sys import time from tools.video004_benchmark import ( RESULT_ROOT, create_fixture, decode_stream, load_fixture, ) SIGNAL = RESULT_ROOT / "canonical_symbols_256.npy" MANIFEST = RESULT_ROOT / "canonical_manifest_256.json" OUTPUT = RESULT_ROOT / "benchmark_256.json" PACKETS = 256 def run() -> dict: if not SIGNAL.exists(): create_fixture(PACKETS, SIGNAL, MANIFEST) received, manifest = load_fixture(SIGNAL, MANIFEST) if manifest["packet_count"] != PACKETS: raise ValueError("неверное число пакетов длинного входа") measured = {} for backend, repeats in (("legacy", 1), ("numba", 3)): times = [] outcomes = None for _ in range(repeats): started = time.perf_counter() current = decode_stream(received, backend, PACKETS) times.append(time.perf_counter() - started) if outcomes is not None and current != outcomes: raise AssertionError("длинный повтор изменил выход") outcomes = current if len(outcomes) != PACKETS or not all(item["crc_pass"] for item in outcomes): raise AssertionError("длинный поток принят не полностью") if [item["packet_sha256"] for item in outcomes] != manifest["expected_packet_sha256"]: raise AssertionError("длинный поток отличается от эталона") times.sort() measured[backend] = {"times_s": times, "median_s": times[len(times) // 2], "factor": times[len(times) // 2] / manifest["signal_duration_s"], "outcomes": outcomes} if measured["legacy"]["outcomes"] != measured["numba"]["outcomes"]: raise AssertionError("длинный поток отличается до и после JIT") for value in measured.values(): value.pop("outcomes") return {"packet_count": PACKETS, "signal_sha256": manifest["signal_sha256"], "signal_duration_s": manifest["signal_duration_s"], "legacy": measured["legacy"], "numba": measured["numba"], "strict_outputs_equal": True, "rf_tx": 0} def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--numba-packages", type=Path) args = parser.parse_args() if args.numba_packages is not None: if not args.numba_packages.is_dir(): parser.error("каталог Numba отсутствует") sys.path.insert(0, str(args.numba_packages.resolve())) result = run() OUTPUT.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8") print(f"256 packets: legacy={result['legacy']['factor']:.3f} " f"numba={result['numba']['factor']:.3f}") if __name__ == "__main__": main()