"""Mide los programas de la semana: mediana de 5 corridas, compilados con -O2 y sin
sanitizers. Los tiempos dependen de la máquina; lo que importa es cómo crecen."""
import statistics
import subprocess
import time

REPETITIONS = 5


def median_seconds(command):
    times = []
    for _ in range(REPETITIONS):
        start = time.perf_counter()
        subprocess.run(command, check=True, stdout=subprocess.DEVNULL)
        times.append(time.perf_counter() - start)
    return statistics.median(times)


def table(title, program, mode, sizes):
    print(title)
    previous = None
    for n in sizes:
        seconds = median_seconds([program, str(n), mode])
        growth = "" if previous is None else f"  x{seconds / previous:.1f}"
        print(f"{n:>10} {seconds:>9.3f} s{growth}")
        previous = seconds


table("Búsqueda lineal", "build/fast/lookup", "linear", [10000, 20000, 40000, 80000])
table("Búsqueda binaria", "build/fast/lookup", "binary", [5000000, 10000000, 20000000])
table("Por copia", "build/fast/copy_in_loop", "copy", [20000, 40000, 80000])
table("Por referencia constante", "build/fast/copy_in_loop", "ref", [20000, 40000, 80000])
table("Por referencia constante, n mucho mayor", "build/fast/copy_in_loop", "ref",
      [10000000, 20000000, 40000000])
