Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

268
Vistas
¿Cómo podemos medir el tiempo de ejecución de una solicitud XMLHttpRequest? El servidor de tiempo comienza a procesar hasta que la respuesta de tiempo está lista

Estoy tratando de medir el tiempo en que un servidor http desarrollado en nodejs procesa una solicitud http asíncrona. Con eso me refiero al momento desde el cual el servidor informa al cliente que comienza a procesar la solicitud, hasta el momento en que el servidor termina de procesar y devuelve la respuesta al cliente.

Entonces, según la documentación de XMLHttpRequest para readyState , tengo la impresión de que la diferencia de tiempo entre readyState == 3 y readyState == 4 me da lo que quiero. En la práctica obtengo casi 0 para ser la diferencia de tiempo entre los dos. Sin embargo, mi expectativa, de acuerdo con los fragmentos de código a continuación, es obtener algo alrededor de 2000+ ms.

¿Por qué es eso y cómo puedo medir aproximadamente el tiempo de procesamiento en la práctica?

 Client side: <script> let begin; const xhttp = new XMLHttpRequest(); xhttp.open("GET", "https://mydomain. com/API", true); xhttp.send(); xhttp.onreadystatechange = function () { if (this.readyState == 3) { begin = Date.now(); } if (this.readyState == 4 && this.status == 200) { console.log("Execution time (ms):" + (Date.now() - begin)); } }; </script>

lado del servidor (como se ve, el procesamiento de una solicitud toma alrededor de 2000 ms)

 let http = require('http'); let url = require('url'); let server = http.createServer(function (req, res) { reqReceived++; let q = url.parse(req.url, true); res.writeHead(200, { "Content-Type": "text/html", "Access-Control-Allow-Origin": "*" }); setTimeout(() => { res.end(`response is ready`); }, 2000); }); server.listen();

Podría argumentar que debería haber escrito el encabezado dentro de la devolución de llamada de tiempo de espera, sin embargo, aún no habría ninguna diferencia de tiempo para que el cliente recibiera readyState == 3 y == 4.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

El readyState correcto para iniciar su temporizador es 1. Node.JS enviará encabezados solo cuando llame a res.end( respuesta está lista );

Probé tu código y lo escaneé usando Wireshark: captura de pantalla

La fila #4 correspondiente a la solicitud enviada por su cliente. El #6 es el encabezado enviado por su servidor con el cuerpo.

Según MDN :

  • estado 2 => XHR recibió encabezados del servidor
  • estado 3 => La respuesta se está cargando (si es un fragmento)
  • estado 4 => Respuesta analizada.

Al probar 2, 3 o 4, solo probará el tiempo que XHR procesará la respuesta. Pero "la respuesta está lista" es muy breve y explica por qué obtuvo 0 ms cada vez.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puedes usar el siguiente código

 var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if(this.readyState == 1) console.time("count"); if (this.readyState == 4 && this.status == 200) { console.timeEnd("count"); } }; xhttp.open("GET", "https://mydomain. com/API", true); xhttp.send(); }

Con esto, puede verificar el tiempo después de que se haya abierto la solicitud. Si desea contar el tiempo total, puede mover console.time antes de la llamada de función open , y puede ver en la pestaña de red (navegador Chrome) que el tiempo está cerca del tiempo real que cuenta el navegador.

 var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { console.timeEnd("count"); } }; console.time("count"); xhttp.open("GET", "https://mydomain. com/API", true); xhttp.send(); }

Nota : si se acerca a 0 ms para su solicitud, asegúrese de haber deshabilitado el caché de su solicitud desde la pestaña de red

about 4 years ago · Juan Pablo Isaza Denunciar

0

Desde MDN , readyState = 3 significa que se está recibiendo el cuerpo de la respuesta. Lo cual interpreto como que la solicitud ya se procesó y el cliente ahora está descargando la respuesta.

Para lograr lo que desea, sugeriría medir la diferencia de tiempo desde que envía la solicitud, justo arriba de xhttp.send() , y cuando readyState es 3. Si fuera yo, lo extendería hasta cuando readyState es 4. Esto proporciona tiempos más realistas que un usuario final podría experimentar e incluye el tiempo que tarda la solicitud en pasar por la red.

Como nota al margen, puede intentar medir la diferencia entre readyState=2 y readyState=4 . Según los documentos de MDN , readyState es 2 cuando se ha enviado la solicitud y el cliente ha recibido los encabezados, lo que significa que la conexión se ha realizado correctamente. Por lo tanto, debería brindar una representación precisa del tiempo empleado durante el procesamiento en el lado del servidor y eliminará cualquier retraso en la red.

Me encantaría saber tus resultados.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda