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)
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]
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?
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];
}
};
Il y a aussi https://github.com/wadey/node-microtime :
> var microtime = require('microtime')
> microtime.now()
1297448895297028
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!
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;
}
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éthodeprocess.hrtime()
renvoyant le temps réel haute résolution actuel dans unebigint
.
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
process.hrtime.bigint()
process.hrtime()
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()
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
_.
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