Как я могу получить точную метку времени в Node.js?
ps Моя версия Node.js равна 0.8.X, а node -microtime extension не работает для меня ( сбой при установке)
Как я могу получить точную метку времени в Node.js?
ps Моя версия Node.js равна 0.8.X, а node -microtime extension не работает для меня ( сбой при установке)
new Date().getTime()
? Это дает вам временную метку в миллисекундах, что является наиболее точным, что даст вам JS.
Обновление: Как указано vaughan, process.hrtime()
доступно в пределах Node.js - его разрешение составляет наносекунды, и поэтому оно намного выше, также это не значит, что оно должно быть более точным.
PS: Чтобы быть более ясным, process.hrtime()
возвращает вам кортеж Array
, содержащий текущее реальное время с высоким разрешением в секундах [секунды, наносекунды]
В Node.js "время высокого разрешения" доступно через process.hrtime
. Он возвращает массив с первым элементом в секундах, а второй - оставшиеся наносекунды.
Чтобы получить текущее время в микросекундах, сделайте следующее:
var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
(Благодаря itaifrenkel для указания ошибки при преобразовании выше.)
В современных браузерах время с точностью до микросекунды доступно как performance.now
. См. https://developer.mozilla.org/en-US/docs/Web/API/Performance/now для документации.
Я выполнил реализацию этой функции для Node.js на основе process.hrtime
, что относительно сложно использовать, если вы только хотите вычислить разницу во времени между двумя точками в программе. См. http://npmjs.org/package/performance-now. За спецификацией эта функция сообщает время в миллисекундах, но это float с точностью до миллисекунды.
В версии 2.0 этого модуля указанные миллисекунды относятся к началу процесса node (Date.now() - (process.uptime() * 1000)
). Вам нужно добавить это к результату, если вы хотите, чтобы временная метка была похожа на Date.now()
. Также обратите внимание, что вы должны перепроверить Date.now() - (process.uptime() * 1000)
. Оба Date.now
и process.uptime
очень ненадежны для точных измерений.
Чтобы получить текущее время в микросекундах, вы можете использовать что-то вроде этого.
var loadTimeInMS = Date.now()
var performanceNow = require("performance-now")
console.log((loadTimeInMS + performanceNow()) * 1000)
См. также: Предоставляет ли JavaScript таймер с высоким разрешением?
now('milli'); // 120335360.999686
now('micro') ; // 120335360966.583
now('nano') ; // 120335360904333
Известно, что now
есть:
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 now('nano');
}
};
Там также https://github.com/wadey/node-microtime:
> var microtime = require('microtime')
> microtime.now()
1297448895297028
Node.js nanotimer
Я написал библиотеку/объект-оболочку для node.js поверх вызова функции process.hrtime
. Он имеет полезные функции, такие как синхронизирующие синхронные и асинхронные задачи, заданные в секундах, миллисекундах, микро и даже нано и следуя синтаксису встроенного таймера javascript, чтобы быть знакомым.
Объекты таймера также дискретны, поэтому вы можете иметь столько, сколько хотите, каждый со своим собственным процессом setTimeout
или setInterval
.
Он называется nanotimer. Проверьте это!
BigInt
данных BigInt
поддерживается начиная с Node.js 10.7.0. (см. также объявление в блоге). Для этих поддерживаемых версий Node.js метод process.hrtime([time])
теперь рассматривается как "устаревший" и заменяется методом process.hrtime.bigint()
.
bigint
версия методаprocess.hrtime()
возвращающая текущее высокое разрешение в реальном времени в виде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);
ТЛ; др
process.hrtime.bigint()
process.hrtime()
Чтобы работать с большей точностью, чем Date.now()
, но с миллисекундами в точности float:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
есть пакеты npm, которые привязываются к функции gettimeofday() системы,
который возвращает микросекундную метку точности в Linux. Искать
npm gettimeofday
. Вызов C быстрее, чем process.hrtime()
Перепишите, чтобы помочь быстро понять:
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
Источник: https://nodejs.org/api/process.html#process_process_hrtime_time
Получить hrtime
как одно число в одной строке:
const begin = process.hrtime();
// ... Do the thing you want to measure
const nanoSeconds = process.hrtime(begin).reduce((sec, nano) => sec * 1e9 + nano)
Array.reduce
, когда ему передан один аргумент, будет использовать первый элемент массива в качестве начального значения accumulator
. Можно использовать 0
в качестве начального значения, и это также будет работать, но зачем делать лишние * 0
.
лучше?
Number(process.hrtime().join(''))