2014-09-25 33 views
5

Mi chiedevo se è possibile misurare il tempo necessario per completare una richiesta HTTP utilizzando node.js. Modificando leggermente un esempio dalla documentazione (here), si può facilmente scrivere il seguente codice. Tempo di misurazione su richieste HTTP node.js

var http = require('http'); 
 
var stamp1 = new Date(); 
 
var stamp2, stamp3, stamp4; 
 
var options = { 
 
    hostname: 'www.google.com', 
 
    port: 80, 
 
    path: '/upload', 
 
    method: 'POST' 
 
}; 
 

 
var req = http.request(options, function(res) { 
 
    stamp3 = new Date(); 
 
    console.log('STATUS: ' + res.statusCode); 
 
    console.log('HEADERS: ' + JSON.stringify(res.headers)); 
 
    res.setEncoding('utf8'); 
 
    res.on('data', function (chunk) { 
 
    console.log('BODY: ' + chunk); 
 
    }); 
 
    res.on('end', function() { 
 
    stamp4 = new Date(); 
 
    console.log ("Stamp 3: " + stamp3); 
 
    console.log ("Stamp 4: " + stamp4); 
 
    }); 
 
}); 
 
req.on('error', function(e) { 
 
    console.log('problem with request: ' + e.message); 
 
}); 
 

 
// write data to request body 
 
req.write('data\n'); 
 
req.write('data\n'); 
 
req.end(); 
 

 
stamp2 = new Date(); 
 
console.log ("Stamp 1: " + stamp1); 
 
console.log ("Stamp 2: " + stamp2);

Ora lasciami venire al mio punto. Sulla risposta si può facilmente misurare il tempo necessario per la risposta, poiché all'inizio viene impostato timbro3 e viene impostato il timbro di fine 4. Quindi, in linea di principio per quantità relativamente grandi di dati, questi due timestamp saranno diversi.

Tuttavia, la domanda che ho è se i timbri 1 e 2 misurano effettivamente ciò che accade quando la richiesta viene preparata e inviata. In altre parole, req.write (....) è un'operazione sincrona? Basandomi sui principi node.js, mi aspetterei che req.write (...) sia un'operazione asincrona in cui si può passare un documento arbitrariamente grande e quindi, una volta completato con successo, si può avere un callback sapendo che la richiesta è terminata.

Commenti?

+2

si consiglia di creare una funzione di utilità per eseguire la misura e si può ottenere un vero e proprio d uscire usando 'Date.now()' sottraendo il secondo timestamp dal primo timestamp. Si noti inoltre che è possibile misurare in nanosecondi con [process.hrtime] (http://nodejs.org/api/process.html#process_process_hrtime). –

+0

Grazie, mi piace il suggerimento process.hrtime perché non ne ero a conoscenza! A partire dalla sottrazione, questo è precisamente il mio punto alla fine per la misurazione effettiva. – MightyMouse

risposta

0

Il docs non menziona alcuna richiamata, quindi suppongo che req.write e res.end siano sincroni.

Quindi nel tuo caso, se ti riferisci solo a quella richiesta che stai iniziando, penso che la misurazione del tempo debba essere accurata. Non mi aspetto però che la differenza di fuso orario sia molto grande (forse anche nello stesso millisecondo).

+0

Ecco perché ho usato la frase "per quantità relativamente grandi di dati", in modo che le misurazioni possano essere disattivate di oltre un millisecondo. D'altra parte, res.on ('end', function() {....}); funziona, e stamp4 ottiene un timestamp e posso vedere la dichiarazione di stampa. D'altra parte, una dichiarazione del modulo req.on ('end', function() {....}); non imposta correttamente timbro2 (presupponendo che timbro2 sia impostato nella funzione di gestore eventi per 'fine' della richiesta e contraria al gestore eventi per il 'fine' della risposta). Quindi, sembra esserci una leggera differenza su come vengono gestite le richieste e le risposte. – MightyMouse

1

Funzione due esistono già per questo:

  • console.time (id), avviare il timer
  • console.timeEnd (id) terminare il timer, stampa id seguita dal tempo in ms

Quindi nel tuo caso:

var req = http.request(options, function(res) { 
    console.time('Requete: '); //Begin to count the time 
    stamp3 = new Date(); 
    console.log('STATUS: ' + res.statusCode); 
    console.log('HEADERS: ' + JSON.stringify(res.headers)); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('BODY: ' + chunk); 
    }); 
    res.on('end', function() { 
     stamp4 = new Date(); 
     console.log ("Stamp 3: " + stamp3); 
     console.log ("Stamp 4: " + stamp4); 
     console.timeEnd('Requete: '); //Will print "Requete: X" with X being the time in ms 
    }); 
}); 
+0

Non penso che tu abbia capito la mia domanda e mi chiedo chi ha svalutato. Dato che è dato si può già calcolare il tempo impiegato per la risposta (ris) semplicemente perché il timestamp 4 è definito sul callback che è disponibile. Il mio punto è che non posso fare la stessa cosa con la richiesta (req). In altre parole, scrivi qualcosa lungo le linee req.on ('end', function() {....}); Ha senso il problema che sto cercando di descrivere? – MightyMouse