Laboratorio frente a campo: dos números que no miden lo mismo
En qué se diferencian una medición controlada y un agregado de usuarios reales, por qué discrepan casi siempre, y cuál manda en cada tipo de decisión.
Un equipo consigue una puntuación de noventa y cinco en el laboratorio y sus datos de campo siguen en rojo. Otro tiene una puntuación mediocre y unos usuarios perfectamente contentos. Las dos situaciones son habituales, ninguna es una contradicción, y las dos se explican por lo mismo: laboratorio y campo miden cosas distintas, con métodos distintos, para responder preguntas distintas. Confundirlos es la causa de la mayor parte del trabajo de rendimiento mal dirigido.
- Enumerar las diferencias metodológicas entre una medición de laboratorio y una de campo.
- Explicar las cinco causas habituales de discrepancia entre ambas.
- Decidir cuál de las dos manda en cada tipo de decisión.
- Instrumentar la recogida de métricas de campo propias.
Las diferencias
| Aspecto | Laboratorio | Campo |
|---|---|---|
| Muestra | Una ejecución, o unas pocas | Miles o millones de sesiones |
| Dispositivo | Uno, emulado | Todos los de tus usuarios reales |
| Red | Simulada o ralentizada | La que cada uno tiene |
| Estado | Limpio, sin caché ni sesión | Cualquiera |
| Interacción | Ninguna, o guionizada | La real |
| Reproducibilidad | Alta | Ninguna, es un agregado |
| Latencia del dato | Inmediata | Días o semanas |
| Atribución | Total, hay traza | Limitada |
Las dos filas que más consecuencias tienen son la de interacción y la de latencia.
La interacción explica por qué el laboratorio no puede medir capacidad de respuesta de forma representativa: no hay nadie interactuando, y el sustituto que se usa —el tiempo de bloqueo— es una aproximación al peor caso, no una medida de lo que le pasó a nadie.
La latencia del dato explica por qué el campo no sirve para iterar: si el agregado tarda días o semanas en reflejar un cambio, no se puede usar para decidir si una optimización funcionó esta tarde.
Las cinco causas de discrepancia
Uno: el dispositivo real es peor que el emulado. La distribución de dispositivos de una audiencia real tiene una cola larga de aparatos lentos, y el percentil que se reporta en campo está influido por esa cola. Un dispositivo de gama media emulado es aproximadamente la mediana; el percentil setenta y cinco está bastante por debajo.
Dos: la caché cambia el escenario. El laboratorio mide en frío por defecto; el campo mezcla visitas en frío y en caliente. Si tu sitio tiene muchos usuarios recurrentes, el campo será mejor que el laboratorio. Si tiene muchos primerizos con red mala, peor.
Tres: el campo incluye rutas que no auditas. La puntuación de laboratorio suele medirse sobre la página principal; el agregado de campo, en su forma más común, incluye el origen entero. Si tu página principal está optimizada y una sección interna es pesada, el campo lo refleja y el laboratorio no.
Cuatro: el usuario interactúa y eso cambia las métricas. Una interacción temprana fija la métrica de pintura mayor en el valor que tuviera. Un usuario que desplaza inmediatamente puede producir métricas mejores o peores que un navegador quieto.
Cinco: las extensiones y el entorno del usuario. Bloqueadores, antivirus que inspeccionan tráfico, proxies corporativos, redes compartidas. Todo eso está en el campo y en ningún laboratorio.
Si el campo es peor que el laboratorio, el campo tiene razón. No es un problema de medición: es que tu laboratorio no representa a tus usuarios. La reacción correcta no es desconfiar del dato sino ajustar las condiciones de la prueba —más ralentización, otra ruta, otro estado de caché— hasta que el laboratorio reproduzca lo que el campo señala. Ese ajuste es en sí mismo un hallazgo, porque te dice en qué se diferencia tu entorno del de tus usuarios.
Cuál manda en cada decisión
La división de trabajo entre los dos es clara si se plantea como una secuencia.
El campo decide qué hay que arreglar. Es la única fuente que sabe qué sufren los usuarios reales. Cualquier priorización que no parta de datos de campo está priorizando por intuición.
El laboratorio decide cómo arreglarlo. Es la única herramienta que da una traza completa con atribución. Una vez el campo señala que la métrica de respuesta va mal en una sección, el laboratorio dice qué función concreta la está bloqueando.
El laboratorio verifica que el arreglo funciona a corto plazo. Comparación antes y después, en condiciones idénticas, en minutos.
El campo confirma que el arreglo importó. Días después, sobre usuarios reales. Y ahí a veces hay sorpresas: optimizaciones que en laboratorio mejoraban claramente y en campo no mueven nada, porque el cuello de botella real estaba en otra parte de la distribución.
Recoger campo propio
Los datos de campo agregados que ofrecen los servicios públicos tienen dos límites: solo cubren orígenes con suficiente tráfico, y no se pueden segmentar por lo que a ti te interese. La instrumentación propia resuelve los dos.
// Recogida de metricas de campo con las dimensiones que hacen falta para actuar
(() => {
const cola = [];
const enviar = () => {
if (!cola.length) return;
const cuerpo = JSON.stringify({
// Dimensiones sin las cuales el dato agregado no sirve para nada
ruta: location.pathname,
version: window.__VERSION_APP ?? 'desconocida',
dispositivo: {
nucleos: navigator.hardwareConcurrency ?? null,
memoriaGB: navigator.deviceMemory ?? null,
dpr: devicePixelRatio,
ancho: innerWidth
},
conexion: navigator.connection?.effectiveType ?? null,
ahorroDatos: navigator.connection?.saveData ?? null,
tipoNavegacion: performance.getEntriesByType('navigation')[0]?.type ?? null,
recargas: performance.getEntriesByType('navigation')[0]?.type === 'reload',
msDesdeCarga: Math.round(performance.now()),
metricas: cola.splice(0)
});
// sendBeacon sobrevive a que la pagina se cierre
navigator.sendBeacon?.('/telemetria/vitals', cuerpo);
};
const anota = (nombre, valor, extra = {}) =>
cola.push({ nombre, valor: Math.round(valor * 1000) / 1000, ...extra });
new PerformanceObserver(l => {
const e = l.getEntries().at(-1);
anota('lcp', e.startTime, {
elemento: e.element?.tagName?.toLowerCase() ?? null,
url: e.url ? e.url.split('/').pop() : null
});
}).observe({ type: 'largest-contentful-paint', buffered: true });
let cls = 0;
new PerformanceObserver(l => {
for (const e of l.getEntries()) if (!e.hadRecentInput) cls += e.value;
}).observe({ type: 'layout-shift', buffered: true });
let peorInp = 0;
new PerformanceObserver(l => {
for (const e of l.getEntries()) {
if (e.interactionId && e.duration > peorInp) {
peorInp = e.duration;
anota('inp', e.duration, {
tipo: e.name,
destino: e.target?.tagName?.toLowerCase() ?? null,
entrada: Math.round(e.processingStart - e.startTime),
proceso: Math.round(e.processingEnd - e.processingStart)
});
}
}
}).observe({ type: 'event', buffered: true, durationThreshold: 40 });
// Enviar cuando la pagina se oculta: es el unico momento fiable
addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') { anota('cls', cls); enviar(); }
});
addEventListener('pagehide', () => { anota('cls', cls); enviar(); });
console.log('Telemetria de campo activa. Los datos se envian al ocultar la pagina.');
})();
Las dimensiones que acompañan a cada métrica son la parte que decide si el dato sirve. Un agregado de la métrica de respuesta sin segmentar por ruta y por dispositivo dice que va mal; el mismo agregado segmentado dice que va mal en una pantalla concreta y en dispositivos de pocos núcleos, que es una tarea. La dimensión de versión de la aplicación es la que permite comprobar el efecto de un despliegue.
El envío al ocultar la página, y no al descargarla, es el detalle técnico que hace que el dato llegue: en móvil, el evento de descarga muchas veces no se dispara, y el de ocultación sí.
Hay un desplazamiento mental que conviene hacer al mirar datos de campo y que cambia el trabajo que se prioriza. La costumbre es leer un percentil alto como una especie de margen de seguridad estadístico, una cifra pesimista que se cita para ser conservador. No es eso. Ese percentil corresponde a personas reales cuya experiencia es exactamente esa, y son una fracción sustancial de tu público, no un caso extremo. Si el percentil setenta y cinco de tu métrica de carga son cinco segundos, una de cada cuatro visitas espera cinco segundos o más, todos los días. Y esa cuarta parte no está distribuida al azar: se concentra sistemáticamente en dispositivos más antiguos, en redes peores y en zonas con peor infraestructura, lo que significa que la distribución de tu rendimiento tiene una correlación bastante directa con la renta de tus usuarios. Esa lectura cambia dos cosas en cómo se toman las decisiones. La primera: deja de tener sentido optimizar la mediana. Mover la mediana de un segundo a novecientos milisegundos no lo nota nadie, mientras que mover el percentil noventa de nueve segundos a cinco cambia por completo la experiencia de un grupo grande de personas que probablemente hoy se van antes de que cargue. El trabajo rentable está casi siempre en la cola, y la cola solo es visible si tu instrumentación registra percentiles y no medias. La segunda: aparece una pregunta que casi nadie se hace y que suele ser la más informativa de todas, que es quién está en esa cola. Segmenta el percentil alto por dispositivo, por región, por tipo de conexión y por ruta, y en la mayoría de los casos la cola no es una nube difusa sino un grupo identificable: una pantalla concreta, una gama de dispositivos concreta, un país concreto donde el servidor está lejos. Cuando eso ocurre, el problema deja de ser “el sitio es lento” y pasa a ser una tarea acotada con una solución conocida, y ese salto de encuadre es lo que la medición de campo aporta y ninguna auditoría de laboratorio puede aportar jamás.