Как получить наиболее точную отметку времени в 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()Пожалуйста.