Как Express измерить время короче 1 мс? - PullRequest
1 голос
/ 13 марта 2020

Я только начал изучать веб-фреймворк под названием Express и обнаружил, что при обновлении веб-страницы, отображаемой с помощью Express, журналы, подобные приведенным ниже, отображались на консоли linux.

GET / 304 20.768 ms - -
GET /stylesheets/style.css 304 0.521 ms - -
GET / 304 35.655 ms - -
GET /stylesheets/style.css 304 0.796 ms - -
GET / 304 33.824 ms - -
GET /stylesheets/style.css 304 1.023 ms - -

Я узнал, что самое короткое время может Javascript измерить - 1 мс (https://en.wikipedia.org/wiki/System_time), как Date ().

Я думал, что журналы отображаются самим Express, поэтому я искал все файлы, чтобы найти слова в этих журналах, но ничего так не было найдено. Я искал "304", "ms", "GET" как ключевое слово, но ничего не было найдено в моем каталоге проекта, включая node_modules.

Какой файл, функция или модуль отображает эти журналы?

Или кто-нибудь знает, как javascript считать время короче 1 мс?

Извините за мой плохой английский sh. Спасибо, что прочитали мой вопрос!

Ответы [ 2 ]

3 голосов
/ 13 марта 2020

Промежуточное программное обеспечение для журналирования, которое чаще всего используется с Express: morgan.

На основе morgan исходного кода мы можем определить, что Морган получает информацию о времени с точностью до наносекунды из базовой функции NodeJS process.hrtime():

this._startAt = process.hrtime()

и из исходного кода NodeJS мы получаем, что его process.hrtime() получает информацию о времени от libuv:

static void Hrtime(const FunctionCallbackInfo<Value>& args) {
  uint64_t t = uv_hrtime();

  Local<ArrayBuffer> ab = args[0].As<Uint32Array>()->Buffer();
  uint32_t* fields = static_cast<uint32_t*>(ab->GetBackingStore()->Data());

  fields[0] = (t / NANOS_PER_SEC) >> 32;
  fields[1] = (t / NANOS_PER_SEC) & 0xffffffff;
  fields[2] = t % NANOS_PER_SEC;
}

В свою очередь, libuv получает информацию о времени непосредственно с базовой платформы. Это , например, реализация Linux:

uint64_t uv__hrtime(uv_clocktype_t type) {
  static clock_t fast_clock_id = -1;
  struct timespec t;
  clock_t clock_id;

  /* Prefer CLOCK_MONOTONIC_COARSE if available but only when it has
   * millisecond granularity or better.  CLOCK_MONOTONIC_COARSE is
   * serviced entirely from the vDSO, whereas CLOCK_MONOTONIC may
   * decide to make a costly system call.
   */
  /* TODO(bnoordhuis) Use CLOCK_MONOTONIC_COARSE for UV_CLOCK_PRECISE
   * when it has microsecond granularity or better (unlikely).
   */
  if (type == UV_CLOCK_FAST && fast_clock_id == -1) {
    if (clock_getres(CLOCK_MONOTONIC_COARSE, &t) == 0 &&
        t.tv_nsec <= 1 * 1000 * 1000) {
      fast_clock_id = CLOCK_MONOTONIC_COARSE;
    } else {
      fast_clock_id = CLOCK_MONOTONIC;
    }
  }

  clock_id = CLOCK_MONOTONIC;
  if (type == UV_CLOCK_FAST)
    clock_id = fast_clock_id;

  if (clock_gettime(clock_id, &t))
    return 0;  /* Not really possible. */

  return t.tv_sec * (uint64_t) 1e9 + t.tv_nsec;
}

Итак, в итоге: время с точностью до наносекунды извлекается непосредственно из операционной системы, пока операционная система поддерживает его .

0 голосов
/ 13 марта 2020

API Performance Timing и process.hrtime() - это два варианта в node.js.

При просмотре кода node.js выясняется, что Express данные, вероятно, поступают из библиотеки http здесь и здесь , которая, по-видимому, использует process.hrtime().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...