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.
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: 
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 :
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.
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
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.