01 · Punto de partida
El tick que tarda un café
En el Tema 46 la rejilla bajaba los chequeos en papel. Ahora el reloj habla: ms por tick y KB por agente en tu máquina. El rendimiento une escalabilidad (Tema 46), memoria y vectores en un perfil que dice dónde duele.
Por eso optimizar sin medir es apostar: el cuello casi nunca está donde parece. Primero cronómetro, después bisturí.
- ¿Cuántos ms tarda cada tick?
- ¿Cuánta memoria ocupa cada agente?
- ¿Qué parte come el tiempo: mover o vecinos?
- ¿Qué se sacrifica para ir más rápido?
02 · Definición
Tiempo, memoria y cuello
Todo rendimiento combina cuánto tarda, cuánto ocupa y dónde se atasca:
Tiempo
Ms por tick y ticks por segundo: lo que el usuario siente. Sin reloj no hay queja fundada.
Memoria
KB por agente y total vivo: lo que el equipo aguanta. Sin cuenta revienta en grande.
Cuello
La parte que come el tiempo: vecinos, dibujo o listas. Lo único que paga optimizar.
| Mundo | Cuello | Remedio típico |
|---|---|---|
| Multitud | vecinos (Tema 34) | rejilla del Tema 46 |
| Epidemia | pares en radio (Tema 32) | celdas que filtran lejos |
| Dibujo | pintar de más | pintar cada K ticks |
| Datos | guardar todo | resumir en el tick |
03 · Perfil
Adivinar frente a medir
La intuición apunta al dibujo; el perfil delata a los vecinos. Creerle al reloj ahorra semanas.
Intuición
Culpa al azar
Opinión sin reloj: “debe ser el dibujo”. Optimiza lo vistoso y el tick ni se mueve.
Perfil
Culpa con número
Reloj por parte: mover 10 % · vecinos 80 %. Ataca el 80 y el tick cae a la vista.
- Rendimiento
- Ms por tick y KB totales con N y ticks dados. Se mide con cronómetro, no con feeling.
- Perfil
- Tiempo por parte: mover, vecinos, dibujar. Lo que dice dónde duele antes de operar.
- Vectorización
- Operar de a bloques y no de a uno: arreglos que vuelan. Velocidad a cambio de simpleza.
- Compromiso
- Lo que se entrega por ir rápido: detalle, precisión o memoria. Sin costo no hay magia.
04 · Ciclo
La ronda que afina con reloj
Cada mejora perfila, ataca el cuello y repite, en este orden:
- 1Perfilar el tick.
Cronometrar mover y vecinos por separado: el parte que manda.
- 2Atacar el cuello.
Rejilla, menos dibujo o resumir datos: una sola cirugía por vez.
- 3Repetir la medida.
Mismo N y ticks con reloj: si no baja, se revierte.
05 · Representación en Python
Reloj que no miente
Medir es restar tiempos y estimar memoria por agente. Lo demás es operar el cuello.
Python en tu navegador. Duplicá N y observá cómo el tiempo canta el cuello antes que vos.
import time
def tick(n):
t0 = time.perf_counter()
s = sum(i * i for i in range(n))
return round((time.perf_counter() - t0) * 1000, 2)
print(tick(10000))
Mide ms de un trabajo con N: el reloj pone número a la sospecha.
Memoria que se estima
Cada agente pesa: contar antes de cargar millones.
def memoria_kb(n, bytes_por_agente=64):
return round(n * bytes_por_agente / 1024, 1)
print(memoria_kb(60000), memoria_kb(1000000))
06 · Exploración
Laboratorio: reloj en mano
Nube que camina ticks con agentes y cuenta vecinos en radio con rejilla. Se cronometra en tu navegador y se estima memoria a 64 bytes por agente. Verde camina, líneas vecinas. ¿A qué N el tick deja de ser interactivo?
El tick bajo reloj
tiempo = ticks × costo_tick
Con 150 agentes, el tick es fluido.
Cada punto camina con paso fijo y cuenta vecinos por rejilla: el tiempo es real de tu equipo. Más radio es más vecinos por tick. Pulsá Nueva réplica para otra nube con los mismos parámetros.
Preguntas para explorar
- Con pocos agentes y ticks, ¿los ms importan? ¿Por qué con N chico el perfil sobra?
- Subí N al máximo con radio grande. ¿Los ms suben lineal o más? ¿Qué parte los empuja?
- Repetí 3 veces iguales. ¿Los ms son idénticos? ¿Qué parte es modelo y qué parte es máquina?
Ver respuestas sugeridas
- No: decenas de ms ni se sienten. Con N chico optimizar es gimnasia.
- Más que lineal: más agentes con más vecinos cada uno. Vecinos manda sobre mover.
- No: el equipo respira distinto cada vez. El modelo pone el nivel, la máquina pone el baile.
07 · Comprensión
Confusiones frecuentes
«Optimizar es apurarse»
Optimizar es medir y atacar el cuello. Apurarse sin perfil toca lo que no duele.
«Más máquina arregla»
Solo corre el techo: el N² se come cualquier fierro. Método primero, fierros después.
«Guardar todo es gratis»
Cada historial pesa por tick y por agente. Resumir en el tick es memoria que no revienta.
«Los ms valen solos»
Valen con N, ticks y equipo declarados. Sin contexto el número no compara.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: reloj que habla
Ejecutá y compará N chico contra grande. Luego duplicá otra vez.
import time
def trabajo(n):
t0 = time.perf_counter()
s = sum(i for i in range(n))
return round((time.perf_counter() - t0) * 1000, 2)
print(trabajo(10000), trabajo(100000))
Ver solución razonada
El grande tarda más con número propio de tu máquina: el reloj canta el costo sin teoría.
Ejercicio 2: predecir la memoria
Sin ejecutar primero: 200 mil agentes a 64 bytes. ¿KB y MB?
print(200000 * 64 / 1024, 200000 * 64 / 1024 / 1024)
Ver solución
Unos 12500 KB y 12,2 MB: contar antes de cargar evita el revientre.
Ejercicio 3: cuello que manda
Si mover tarda 2 ms y vecinos 18 ms, ¿qué atacás? Escribilo.
Ver una posible respuesta
print("vecinos: 90 % del tick")
Atacar vecinos rinde 9 veces más que mover. Perfil manda.
09 · Síntesis
Ideas para recordar
- Rendir es ms por tick y KB con N y equipo declarados.
- Perfil antes que bisturí: vecinos suele mandar.
- Rejilla, menos dibujo y resumir son las tres cirugías.
- Toda mejora informa antes y después gemelos.
- En Python, perf_counter para tiempo y cuenta por agente para memoria.
En el próximo tema veremos la visualización de agentes: ver rejillas, redes y movimientos.