Как я могу получить точную метку времени в 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(''))