Как получить microtime в Node.js?

Как я могу получить точную метку времени в Node.js?

ps Моя версия Node.js равна 0.8.X, а node -microtime extension не работает для меня ( сбой при установке)

Ответ 1

new Date().getTime()? Это дает вам временную метку в миллисекундах, что является наиболее точным, что даст вам JS.

Обновление: Как указано vaughan, process.hrtime() доступно в пределах Node.js - его разрешение составляет наносекунды, и поэтому оно намного выше, также это не значит, что оно должно быть более точным.

PS: Чтобы быть более ясным, process.hrtime() возвращает вам кортеж Array, содержащий текущее реальное время с высоким разрешением в секундах [секунды, наносекунды]

Ответ 2

В 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 таймер с высоким разрешением?

Ответ 3

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');
  }

};

Ответ 5

Node.js nanotimer

Я написал библиотеку/объект-оболочку для node.js поверх вызова функции process.hrtime. Он имеет полезные функции, такие как синхронизирующие синхронные и асинхронные задачи, заданные в секундах, миллисекундах, микро и даже нано и следуя синтаксису встроенного таймера javascript, чтобы быть знакомым.

Объекты таймера также дискретны, поэтому вы можете иметь столько, сколько хотите, каждый со своим собственным процессом setTimeout или setInterval.

Он называется nanotimer. Проверьте это!

Ответ 6

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);

ТЛ; др

  • Node.js 10.7. 0+ - используйте process.hrtime.bigint()
  • В противном случае - используйте process.hrtime()

Ответ 7

Чтобы работать с большей точностью, чем Date.now(), но с миллисекундами в точности float:

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}

Ответ 8

есть пакеты npm, которые привязываются к функции gettimeofday() системы, который возвращает микросекундную метку точности в Linux. Искать npm gettimeofday. Вызов C быстрее, чем process.hrtime()

Ответ 9

Перепишите, чтобы помочь быстро понять:

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

Ответ 10

Получить 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.

Ответ 11

лучше?

Number(process.hrtime().join(''))