73 lines
3.0 KiB
Python
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()
|