Medir el rendimiento del navegador con User Timing API
Mide recorridos propios con marcas y medidas, interpreta resultados ruidosos y conserva solo los datos necesarios.
BotBrowser Team
Quieres la documentación estructurada de Plataforma?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
User Timing API permite a una aplicación nombrar puntos de su propio trabajo y medir el intervalo entre ellos. Sirve para responder una pregunta acotada como «¿cuánto tardó la validación del pago en esta versión?». No es un benchmark del dispositivo ni una señal de identidad. Una medición útil empieza por un resultado visible, sitúa ambos límites donde la aplicación pueda explicarlos y registra solo los campos necesarios para decidir qué cambiar.
Marcas y medidas de rendimiento
performance.mark(name) registra un punto nombrado en la línea temporal del documento. performance.measure(name, startMark, endMark) crea un intervalo entre dos marcas. Elige nombres estables que describan un paso visible como search-submit-start, results-visible y payment-validation-complete.
performance.mark('cart-submit-start');
try {
await validateCart();
performance.mark('cart-submit-end');
performance.measure('cart-submit', 'cart-submit-start', 'cart-submit-end');
} finally {
performance.clearMarks('cart-submit-start');
performance.clearMarks('cart-submit-end');
}
La especificación W3C User Timing Level 3 define estas entradas y la referencia MDN documenta los métodos. Detecta las funciones, tolera una marca ausente o una operación rechazada y conserva utilizable la tarea principal. Usa try/finally para limpiar rutas correctas, fallidas y canceladas; asigna nombres de ejecución para que el trabajo concurrente no borre marcas de otro componente.
Mide recorridos propios
Empieza por el recorrido y su resultado de aceptación. En una búsqueda, mide de envío a resultados visibles y separa solicitud, análisis y renderizado solo si cada intervalo responde a una decisión accionable. Mantén navegación, recursos y User Timing separados: una marca de código de aplicación no demuestra el tiempo de red o servidor.
Marca en límites que tu equipo controla. Si un widget externo decide el final, descríbelo como observación. Conserva cancelación y reintentos y usa un fixture id corto, no contenido de página ni identificadores de cuenta.
El artefacto concreto es el fixture copiable anterior y esta tabla. Cubre éxito, error, cancelación, API no disponible y finalización tardía. El resultado esperado es una página utilizable, una medida acotada solo cuando existen ambas marcas y ninguna marca retenida tras la limpieza.
| Resultado | Registrar | Acción visible |
|---|---|---|
| Existen ambas marcas | una duración y etiqueta de ejecución | continuar |
| API no disponible | measurement-unavailable | continuar sin medir |
| Falla de validación | estado y duración acotada si existe | mostrar error y reintentar |
| Usuario cancela | estado de cancelación, sin duración inventada | conservar entrada y detener |
| Finalización tardía | ignorar si la ejecución quedó obsoleta | conservar vista actual |
BotBrowser puede ejecutar recorridos autorizados en contextos controlados y comparar resultados visibles con una configuración declarada. No vuelve determinista el trabajo de la aplicación, no cambia la especificación y no certifica que una duración represente el dispositivo de una persona.
Minimiza los datos
Recoge solo nombre de medida, duración agregada o por cubeta, versión, fixture id y resultado. Evita URL, consultas, texto, cuentas y un historial de larga duración. Antes de exportar, define el sistema receptor, el grupo con acceso, el plazo de conservación y la ruta de eliminación. Aunque una duración no contenga texto, los eventos repetidos asociados con marcas de tiempo u otros registros pueden describir una sesión. Si la decisión no necesita diagnóstico por ejecución, agrega los datos antes de transferirlos. Limita el diagnóstico a la ventana del incidente o de la prueba, fija su vencimiento y después elimina la clave de asociación y el rastro detallado. Usa un id breve durante esa ventana y hazlo expirar después. Exporta una lista permitida y limpia las entradas al terminar; no mezcles marcas con propiedades del navegador para crear perfiles.
La precisión reducida y los datos ausentes son normales tras restauración desde caché, prerenderizado, Service Worker o cambios de visibilidad. Etiqueta esos contextos por separado y nunca sustituyas un valor ausente por una duración «típica» inventada.
Interpreta resultados ruidosos
Caché, red, carga del servidor, CPU, estado de página, versión y trabajo concurrente cambian la distribución. Compara el mismo fixture, ruta, versión y ventana; usa percentiles y tamaño de muestra, no un único promedio. Un p95 peor con mediana estable sugiere una cola; un desplazamiento general puede señalar un cambio de entorno.
Primero comprueba resultado visible, entrada conservada y limpieza; después examina agregados. No publiques umbrales universales ni cortes de detección. Un timeout, una marca ausente y una promesa rechazada son resultados normales con una recuperación documentada. Repite el fixture mínimo y compara tiempos de servidor, recursos, cola y versión. User Timing localiza un límite de regresión, pero no prueba por sí solo la causa.
La ejecución simultánea necesita nombres con un identificador propio; los nombres globales pueden emparejar un inicio con el final equivocado.
Una promesa rechazada puede omitir la marca final, por lo que debe conservarse el estado de error y limpiarse la marca inicial.
Una cancelación debe invalidar la ejecución antes de iniciar otra para que una respuesta tardía no cambie la vista actual.
Si la API no existe, not-measured es distinto de una duración cero y la interacción debe continuar.
El fixture debe declarar entradas sintéticas, esperas acotadas y una forma de restablecerse sin dejar entradas para la siguiente prueba.
Antes de cada ejecución, elimina solo las marcas cuyo prefijo pertenece al fixture; no borres la línea temporal de otros componentes.
Una medida repetible no exige un tiempo idéntico: exige que el mismo cambio de estado y las mismas reglas de limpieza se puedan comprobar.
Define si el intervalo incluye reintentos, cola, animación o espera de renderizado, y conserva esa definición entre versiones.
Una marca no debe bloquear el envío ni reemplazar el error original si la limpieza falla.
Compara primero el resultado funcional y después la distribución temporal para decidir dónde investigar.
Registra la revisión del fixture, la clase de ruta, la versión del navegador, la ventana y el número de muestras.
Mantén el resumen separado de los diagnósticos detallados y elimina los identificadores temporales al terminar la ventana autorizada.
Si una etiqueta cambia de significado, inicia una serie nueva en lugar de mezclar intervalos incompatibles.
Un recorrido de envío a resultado visible responde a una pregunta de producto; no responde si un dispositivo es rápido.
El estado superseded explica por qué falta una medida sin inventar una duración.
La ausencia de una entrada puede ser evidencia útil cuando el flujo terminó por cancelación, error o cambio de página.
Lista de lanzamiento
Fija nombres, responsables de inicio y fin, entradas del fixture, configuración del navegador, ventana, agregación y retención. Prueba soporte y ausencia de API, errores, cancelación, reintentos, repetición, localización y restauración de página. Confirma que la limpieza no elimina entradas ajenas y revisa escritorio y móvil.
La secuencia es: definir una pregunta propia; marcar límites; medir solo con ambos puntos; limpiar; agregar ejecuciones comparables; conservar la mínima evidencia. Así el rendimiento queda explicado sin convertir el tiempo de aplicación en medición encubierta.
Fuentes públicas
Lecturas relacionadas
Artículos Relacionados
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.