Files
SDR-Rover/tools/video004_longrun.py

73 lines
3.0 KiB
Python

"""Длинный контроль 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()