Как получить наиболее точную отметку времени в Node.js?
ps Моя версия Node.js - 0.8.X, и расширение node-microtime у меня не работает (сбой при установке)
Как получить наиболее точную отметку времени в Node.js?
ps Моя версия Node.js - 0.8.X, и расширение node-microtime у меня не работает (сбой при установке)
Ответы:
new Date().getTime()
? Это дает вам отметку времени в миллисекундах, которая является наиболее точной, которую вам может дать JS.
Обновление: как заявил vaughan, process.hrtime()
он доступен в Node.js - его разрешение составляет наносекунды, и поэтому оно намного выше, также это не означает, что оно должно быть более точным.
PS: Для большей ясности process.hrtime()
возвращает вам кортеж, Array
содержащий текущее реальное время с высоким разрешением в [секунды, наносекунды]
process.hrtime()
В 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 . Согласно спецификации, эта функция сообщает время в миллисекундах, но это число с плавающей точкой с точностью до миллисекунды.
В версии 2.0 этого модуля миллисекунды указываются относительно того, когда был запущен процесс узла ( 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 таймер с высоким разрешением?
process.hrtime()
чтобы получить разницу. например, var startTime = process.hrtime();
а затем var diff = process.hrtime(startTime);
.
require("performance.now")
быть require("performance-now")
?
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');
}
};
Тип 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);
tl; dr
process.hrtime.bigint()
process.hrtime()
Также есть https://github.com/wadey/node-microtime :
> var microtime = require('microtime')
> microtime.now()
1297448895297028
Node.js нанотаймер
Я написал библиотеку / объект оболочки для node.js поверх process.hrtime
вызова функции. Он имеет полезные функции, такие как синхронные и асинхронные задачи по времени, указываемые в секундах, миллисекундах, микро или даже нано, и следует синтаксису встроенного таймера javascript, чтобы быть знакомым.
Объекты таймера также являются дискретными, поэтому вы можете иметь их сколько угодно, каждый со своим собственным setTimeout
или setInterval
запущенным процессом.
Это называется нанотаймер . Проверьте это!
Чтобы работать с большей точностью Date.now()
, но с точностью до миллисекунд с плавающей запятой:
function getTimeMSFloat() {
var hrtime = process.hrtime();
return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
Получить 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
.
Перепишите, чтобы помочь быстро понять:
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
Я не очень горжусь этим решением, но вы можете получить метку времени в микросекундах или наносекундах таким образом:
const microsecond = () => Number(Date.now() + String(process.hrtime()[1]).slice(3,6))
const nanosecond = () => Number(Date.now() + String(process.hrtime()[1]).slice(3))
// usage
microsecond() // return 1586878008997591
nanosecond() // return 1586878009000645600
// Benchmark with 100 000 iterations
// Date.now: 7.758ms
// microsecond: 33.382ms
// nanosecond: 31.252ms
Знайте, что:
Date.now()
Date.now()
на, Number(new Date())
чтобы получить метку времени в миллисекундахРедактировать:
Здесь решение иметь микросекунду с запятой, однако номер версии будет округлен изначально с помощью javascript. Поэтому, если вам нужен один и тот же формат каждый раз, вы должны использовать его версию String.
const microsecondWithCommaString = () => (Date.now() + '.' + String(process.hrtime()[1]).slice(3,7))
const microsecondWithComma = () => Number(Date.now() + '.' + String(process.hrtime()[1]).slice(3,7))
microsecondWithCommaString() // return "1586883629984.8997"
microsecondWithComma() // return 1586883629985.966
process.hrtime () не дает текущих ts.
Это должно работать.
const loadNs = process.hrtime(),
loadMs = new Date().getTime(),
diffNs = process.hrtime(loadNs),
microSeconds = (loadMs * 1e6) + (diffNs[0] * 1e9) + diffNs[1]
console.log(microSeconds / 1e3)
лучше?
Number(process.hrtime().join(''))
Date.now()
Пожалуйста.