web-dev-qa-db-fra.com

Comment obtenir un microtime dans Node.js?

Comment puis-je obtenir l'heure la plus précise dans Node.js?

ps Ma version de Node.js est 0.8.X et l'extension node-microtime ne fonctionne pas pour moi (plantage lors de l'installation) 

69
NiLL

new Date().getTime()? Cela vous donne un horodatage en millisecondes, qui est le plus précis que JS vous donnera.

Mise à jour: comme l'a déclaré vaughan, process.hrtime() est disponible dans Node.js - sa résolution est en nanosecondes et, par conséquent, elle est beaucoup plus élevée. Cela ne signifie pas non plus qu'elle doit être plus précise.

PS .: Juste pour être plus clair, process.hrtime() vous renvoie un tuple Array contenant le temps réel actuel haute résolution dans un délai de [secondes, nanosecondes]

75
Niet the Dark Absol

Dans Node.js, le "temps de résolution élevée" est rendu disponible via process.hrtime . Il retourne un tableau avec le premier élément, le temps en secondes, et le second, les nanosecondes restantes.

Pour obtenir l'heure actuelle en microsecondes, procédez comme suit:

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

(Merci à itaifrenkel pour avoir signalé une erreur dans la conversion ci-dessus.)

Dans les navigateurs modernes, l'heure avec une précision en microsecondes est disponible sous la forme performance.now. Voir https://developer.mozilla.org/en-US/docs/Web/API/Performance/now pour obtenir de la documentation.

J'ai implémenté cette fonction pour Node.js, basée sur process.hrtime, ce qui est relativement difficile à utiliser si vous voulez uniquement calculer le décalage temporel entre deux points d'un programme. Voir http://npmjs.org/package/performance-now . Selon les spécifications, cette fonction rapporte le temps en millisecondes, mais c'est un flottant avec une précision inférieure à la milliseconde.

Dans la version 2.0 de ce module, les millisecondes signalées sont relatives au moment où le processus de noeud a été démarré (Date.now() - (process.uptime() * 1000)). Vous devez ajouter cela au résultat si vous voulez un horodatage similaire à Date.now(). Notez également que vous devez recalculer Date.now() - (process.uptime() * 1000). Date.now et process.uptime sont très peu fiables pour des mesures précises.

Pour obtenir l'heure actuelle en microsecondes, vous pouvez utiliser quelque chose comme ceci.

var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)

Voir aussi: JavaScript fournit-il un minuteur à haute résolution?

154
Myrne Stol
now('milli'); //  120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; //  120335360904333

Sait que now est: 

const now = (unit) => {

  const hrTime = process.hrtime();

  switch (unit) {

    case 'milli':
      return hrTime[0] * 1000 + hrTime[1] / 1000000;

    case 'micro':
      return hrTime[0] * 1000000 + hrTime[1] / 1000;

    case 'nano':
      return hrTime[0] * 1000000000 + hrTime[1];

    default:
      return hrTime[0] * 1000000000 + hrTime[1];
  }

};
13
Abdennour TOUMI

Il y a aussi https://github.com/wadey/node-microtime :

> var microtime = require('microtime')
> microtime.now()
1297448895297028
6
mikemaccana

Node.js nanotimer

J'ai écrit un objet bibliothèque/objet pour node.js en plus de l'appel de la fonction process.hrtime. Il possède des fonctions utiles, telles que le chronométrage des tâches synchrones et asynchrones, spécifiées en secondes, millisecondes, micro ou même nano, et suit la syntaxe de la minuterie JavaScript intégrée afin de vous familiariser.

Les objets minuterie sont également discrets. Vous pouvez donc en exécuter autant que vous le souhaitez, chacun ayant son propre processus setTimeout ou setInterval en cours d'exécution. 

Cela s'appelle nanotimer . Vérifiez-le!

5
krb686

Pour travailler avec plus de précision que Date.now(), mais avec des millisecondes en précision float:

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
3
Ross

Le type BigInt data est pris en charge depuis Node.js 10.7.0. (voir aussi l'annonce de blog post). Pour ces versions prises en charge de Node.js, la méthode process.hrtime([time]) est maintenant considérée comme "héritée", remplacée par la méthode process.hrtime.bigint() .

La version bigint de la méthode process.hrtime() renvoyant le temps réel haute résolution actuel dans une bigint.

const start = process.hrtime.bigint();
// 191051479007711n

setTimeout(() => {
  const end = process.hrtime.bigint();
  // 191052633396993n

  console.log(`Benchmark took ${end - start} nanoseconds`);
  // Benchmark took 1154389282 nanoseconds
}, 1000);

tl; dr

  • Node.js 10.7.0+ - Utiliser process.hrtime.bigint()
  • Autrement - Utilisez process.hrtime()
1
d4nyll

il y a des paquets npm qui se lient à la fonction système gettimeofday (), qui renvoie un horodatage de précision en microsecondes sous Linux. Rechercher Npm gettimeofday. L'appel de C est plus rapide que process.hrtime()

0
Andras

Obtenez hrtime sous forme de numéro unique sur une ligne:

_const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)
_

_Array.reduce_, lorsqu'un seul argument lui est attribué, utilisera le premier élément du tableau comme valeur initiale accumulator. On pourrait utiliser _0_ comme valeur initiale et cela fonctionnerait aussi bien, mais pourquoi le supplément _* 0_.

0
Cameron Tacklind

Une réécriture pour aider à comprendre rapidement:

const hrtime = process.hrtime();     // [0] is seconds, [1] is nanoseconds

let nanoSeconds = (hrtime[0] * 1e9) + hrtime[1];    // 1 second is 1e9 nano seconds
console.log('nanoSeconds:  ' + nanoSeconds);
//nanoSeconds:  97760957504895

let microSeconds = parseInt(((hrtime[0] * 1e6) + (hrtime[1]) * 1e-3));
console.log('microSeconds: ' + microSeconds);
//microSeconds: 97760957504

let milliSeconds = parseInt(((hrtime[0] * 1e3) + (hrtime[1]) * 1e-6));
console.log('milliSeconds: ' + milliSeconds);
//milliSeconds: 97760957

Source: https://nodejs.org/api/process.html#process_process_hrtime_time

0