Знание использования ресурсов будет иметь большое значение для определения частей вашей системы, которые необходимо оптимизировать.

Поскольку theevent loop имеет отношение к истории, давайте сначала расшифруем ее.

Цикл событий

Архитектура Node в основном состоит из двух основных компонентов: V8, движка, который служит интерпретатором JavaScript, и libuv, библиотеки, которая обеспечивает цикл обработки событий для Node.js. Также важен тот факт, что в приложении Node все проходит через цикл событий.

Node.js - это платформа, основанная на событиях, что означает, что все происходит как реакция на событие. В любом данном управляемом событиями приложении обычно есть основной цикл, который прослушивает события, а затем запускает функцию обратного вызова при обнаружении одного из этих событий.

Чтобы по-настоящему понять цикл событий, давайте погрузимся в различные фазы цикла цикла событий и то, что происходит в каждой из них.

а. Таймеры

Здесь будет обработано все, что было запланировано setTimeout() и setInterval().

б. Установить немедленно

Выполняет все обратные вызовы, зарегистрированные через setImmediate().

c. Обратные вызовы IO

Здесь обрабатывается большая часть обратных вызовов.

d. IO Polling

Опросы для обработки новых событий при следующем запуске.

е. Закрывать

Здесь обрабатываются все on('close') события.

Это практически все, что вам нужно знать о цикле событий. Но, если вы хотите узнать больше об этом, просмотрите документацию по Node и / или этот блог.

Большой поклонник Node.js API

Как ни странно, в Node.js есть встроенные модули, которые делают этот процесс проще и интереснее. API Node.js предоставляет нам Performance Timing API, который помогает в сборе показателей производительности с высоким разрешением.

В этом руководстве мы узнаем, как использовать модуль performance hooks для получения соответствующей статистики записи и чтения данных из файловой системы. Давайте нырнем!

Стоит отметить, что я не буду использовать какие-либо внешние зависимости (или модули) в этом небольшом проекте, поэтому вы узнаете, как создать REST API в Node.js, в любой момент не используя npm install. Круто, правда?

Предпосылки;

На момент написания этого блога версия Node с долгосрочной поддержкой (LTS) - -v 8.11.3. Убедитесь, что на вашем компьютере установлена ​​эта или более поздняя версия.

Я буду использовать бессонницу в качестве предпочтительного клиента REST API.

Зайдите на Github и клонируйте это репо.

Перейдите в каталог проекта и запустите сервер с: node index.js. Ваш терминал должен logServer running on port: 4000.

Запустите свой Postman или Insomnia и отправьте GET запрос на: localhost:4000/index

В моем случае, когда я бегу, в Insomnia я вижу следующее: localhost:4000/index.

Попробуйте использовать другие маршруты, чтобы убедиться, что все работает правильно:

Все доступные маршруты можно увидеть в lib/routeHandler.js. А теперь перейдем к хорошему :)

Реализация хуков производительности

В вашем lib.routeHandler.js импортируйте модуль perf_hooks:

const performance = require('perf_hooks').performance;
// or using the ES6 syntactic sugar
const { performance } = require('perf_hooks');

Зарегистрируем performance marks. Мы будем использовать эти отметки, чтобы собрать все performance measures.

Мы проверим время, необходимое для запуска handler._user.post метода. Однако вы можете добавить любой тест любой другой части нашего API. Сразу под заголовком функции: handler._user.post = (data, callback) = > { введите следующее:

performance.mark('Beginning sanity check');

Ниже переменной phone,

введите следующее:

performance.mark('Ending sanity check');

Давайте посчитаем за ms, сколько времени требуется для проверки данных запроса:

Чуть ниже performance.mark('Ending sanity check'); введите следующее:

performance.measure('Inputs validation', 'Beginning sanity check', 'Ending sanity check');

performance.measure() принимает три аргумента: name, startMark & endMark. Судя по названиям, приведенным выше, мы измеряем производительность между моментом Beginning sanity check и временем его окончания: Ending sanity check. Затем мы дали нашей проверке производительности имя Inputs validation.

Еще одно изменение перед тем, как мы увидим журналы производительности.

Я включу модуль utilities для отладки. Чуть ниже: const { performance } введите следующее:

const util = require('util');
const debug = util.debuglog('performance');

Выключим все наши измерения. Запись о производительности имеет имя, тип, отметку времени начала и продолжительность. В этом случае мы выйдем только из-за названия и продолжительности записи.

performance.measure('Inputs validation', 'Beginning sanity check', 'Ending sanity check');
// insert here
const measurements = performance.getEntriesByType('measure');
measurements.forEach(measurement => {
  // I'm going to make the logs colour-coded, in this case I'm using Green
  debug('\x1b[32m%s\x1b[0m', measurement.name + ' ' + measurement.duration);
})

Чтобы получать отладочные сообщения, мы запустим наш сервер с:

NODE_DEBUG=performance node index.js

performance - это имя раздела, которое мы определили ранее: const debug = util.debuglog('performance');

Теперь вы должны увидеть несколько журналов в своем терминале:

Посмотрим, сколько времени займет выполнение всего post запроса:

Чтобы получать последние обновления в базе кода, проверьте этот тег: add_perf_hooks.

Теперь ваша задача - поставить отметку о производительности на user reading & user creating. Оставьте комментарий, если вам понадобится помощь. Вы также можете найти меня в Твиттере.

Спасибо за прочтение! Увидимся в следующий раз.