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

Ответы:

102

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

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

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

Ниет Темный Абсол
источник
91
Date.now()Пожалуйста.
jAndy
50
Useprocess.hrtime()
vaughan
3
Я должен согласиться. Это совершенно неверный ответ. См. Ниже ответ @Meryn Stol для правильного ответа.
Джастин Варкентин
11
process.hrtime () Эти времена относятся к произвольному времени в прошлом, не связаны со временем дня и, следовательно, не подвержены смещению часов. Основное использование - измерение производительности между интервалами. Так что это не показывает текущее время
Alex
9
Все основные ответы неверны. process.hrtime()не возвращает текущее время.
178

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

Мирн Стол
источник
27
Следует отметить, что для выполнения теста вы можете передать результат предыдущего вызова, process.hrtime()чтобы получить разницу. например, var startTime = process.hrtime();а затем var diff = process.hrtime(startTime);.
Джастин Варкентин
5
Пожалуйста, проверьте единицы времени при переводе секунд в микросекунды. console.log (hrTime [0] * 1000000 + hrTime [1] / 1000)
itaifrenkel
Спасибо, что указали на эту ошибку, itaifrenkel! Я исправил код конвертации.
Мирн Стол
2
Не должно require("performance.now")быть require("performance-now")?
UpTheCreek
5
process.hrtime()не возвращает текущее время.
21
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');
  }

};
Абденнур Туми
источник
14
process.hrtime()не возвращает текущее время.
какие ОС у вас есть?
Abdennour TOUMI
12

Тип 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

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

Также есть https://github.com/wadey/node-microtime :

> var microtime = require('microtime')
> microtime.now()
1297448895297028
микемаккана
источник
OP заявила, что они пробовали этот пакет и не смогли установить его.
Кэмерон Тэклинд,
@CameronTacklind Да, действительно, они назвали это «расширением»; что заставило меня скучать по этому. Поскольку многие люди приходят к этой статье с вопросом - как сделать микровремя на узле - ответ по-прежнему полезен.
mikemaccana
5

Node.js нанотаймер

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

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

Это называется нанотаймер . Проверьте это!

686 крб
источник
2

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

function getTimeMSFloat() {
    var hrtime = process.hrtime();
    return ( hrtime[0] * 1000000 + hrtime[1] / 1000 ) / 1000;
}
Росс
источник
2
process.hrtime () не возвращает текущее время
Марк Дж. Шмидт
Ты прав. Из документации: «Эти времена относятся к произвольному времени в прошлом и не связаны со временем дня и, следовательно, не подвержены дрейфу часов. Основное использование - для измерения производительности между интервалами» nodejs.org/api/process .html # process_process_hrtime_time
Росс
1

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

Кэмерон Тэклинд
источник
0

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

Андраш
источник
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

Манохар Редди Поредди
источник
0

Я не очень горжусь этим решением, но вы можете получить метку времени в микросекундах или наносекундах таким образом:

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

Знайте, что:

  • Это решение работает исключительно с node.js ,
  • Это примерно в 3-10 раз медленнее, чемDate.now()
  • Как ни странно, это кажется очень точным, hrTime, похоже, следует точно за отметками времени js.
  • Вы можете заменить 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
пирс
источник
0

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)
Саравана Кумар Чиннарадж
источник
-8

лучше?

Number(process.hrtime().join(''))
infinito84
источник
3
Это вообще не работает. НЕ ИСПОЛЬЗУЙ. Поскольку эти значения являются целыми числами, второй элемент массива никогда не будет иметь фиксированной ширины. Нет ведущих нулей для объединения в строку.
user.friendly
Number (process.hrtime (). Map ((n, i) => i? ('000000000' + n) .slice (-9): n) .join (''))
Майк