2016-06-29 7 views
4

Ich versuche, ein Problem zu beheben, bei dem Anfragen von node.js an die Remote-HTTP-API zu lange dauern. Mit zu beginnen, habe ich beschlossen, Timing meiner Knoten Anwendung hinzuzufügen:node.js Zeit: process.hrtime() vs neue Date(). GetTime()?

'use strict'; 

let logger = require('./logger'); 
let request = require('request'); 

module.exports = function(uri, done) { 
    // set full url. 
    let options = { 
    uri: `http://example.org/${uri}`, 
    timeout: 60000, 
    json: true, 
    gzip: true, 
    encoding: null 
    }; 
    const startDate = new Date().getTime(); 
    const start = process.hrtime(); 

    request(options, function(error, response, body) { 
    const endDate = new Date().getTime(); 
    const end = process.hrtime(start); 
    const durationDate = endDate - startDate; 
    const duration = end[1]/1000000; 
    const diff = Math.abs(Math.round(durationDate - duration)); 
    logger.debug(`${uri} hrtime: ${duration} ms, date: ${durationDate} ms, diff: ${diff}`); 
    if (!error && response.statusCode === 200) { 
     done(error, response, body, body); 
    } else { 
     done(error, response, body); 
    } 
    }); 
}; 

Und dies ist der Ausgang i erhalten:

<....> 
2016-06-29T10:26:59.230Z /account hrtime: 41.567354 ms, date: 41 ms, diff: 1 
2016-06-29T10:27:06.369Z /account hrtime: 42.052154 ms, date: 42 ms, diff: 0 
2016-06-29T10:27:13.368Z /account hrtime: 51.582807 ms, date: 5052 ms, diff: 5000 
2016-06-29T10:27:14.971Z /account hrtime: 40.705936 ms, date: 40 ms, diff: 1 
2016-06-29T10:27:22.490Z /account hrtime: 45.953398 ms, date: 5046 ms, diff: 5000 
2016-06-29T10:27:29.669Z /account hrtime: 42.504256 ms, date: 5043 ms, diff: 5000 
2016-06-29T10:27:31.622Z /account hrtime: 39.405575 ms, date: 39 ms, diff: 0 
<....> 
2016-06-29T10:27:45.135Z /account hrtime: 40.594642 ms, date: 41 ms, diff: 0 
2016-06-29T10:27:52.682Z /account hrtime: 40.290881 ms, date: 40 ms, diff: 0 
2016-06-29T10:28:05.115Z /account hrtime: 50.81821 ms, date: 10050 ms, diff: 9999 
2016-06-29T10:28:13.555Z /account hrtime: 52.061123 ms, date: 52 ms, diff: 0 
<.....> 
2016-06-29T10:29:45.052Z /account hrtime: 44.252486 ms, date: 44 ms, diff: 0 
2016-06-29T10:29:46.829Z /account hrtime: 39.652963 ms, date: 40 ms, diff: 0 
2016-06-29T10:29:49.101Z /account hrtime: 40.841915 ms, date: 41 ms, diff: 0 
2016-06-29T10:29:55.097Z /account hrtime: 44.161802 ms, date: 5044 ms, diff: 5000 
2016-06-29T10:30:01.784Z /account hrtime: 47.732807 ms, date: 47 ms, diff: 1 
2016-06-29T10:30:04.309Z /account hrtime: 40.151299 ms, date: 40 ms, diff: 0 
2016-06-29T10:30:06.926Z /account hrtime: 39.933368 ms, date: 40 ms, diff: 0 
2016-06-29T10:30:14.440Z /account hrtime: 53.610396 ms, date: 5054 ms, diff: 5000 

Also manchmal der Unterschied zwischen hrtime und getTime() ist riesig .
Und dies ist nicht nur einige falsche Berichterstattung, sondern tatsächliche Verhalten - wenn Sie auf die Remote-HTTP-Server-Protokolle schauen, sehe ich, dass alle Anfragen tatsächlich Zeit von hrtime, und die Zeit von getTime() gemeldet Zeit ist tatsächlich, wie lange der Knoten. js Anwendung reagiert. Es scheint also, dass es in der Anwendung node.js selbst zu Verzögerungen kommt. Irgendwelche Treffer, warum das passiert?

Knoten v4.4.6

Antwort

1

ändern

const duration = end[1]/1000000; 

zu

const duration = (end[0]*1000) + (end[1]/1000000); 

werden Sie Ergebnis erforderlich bekommen. hrtime gibt ein Array mit zwei Werten zurück - zuerst eins ist Sekunden, also multiplizieren Sie es mit 1000, um Millisekunden zu erhalten, zweiter Wert ist Mikrosekunden, also dividieren durch 1 gefolgt von 6 Nullen, also 1000000 fügen beide hinzu, um das Ergebnis

zu erhalten