Чем объясняются задержки после запуска какой-либо Node.js-утилиты и увеличение скорости выполнения при повторных запусках?

Эти два явления связанные, потому я объединил их в одни вопрос.

При первом запуске Node.js-утилит типа Gulp или Webpack происходит большая задержка до начала выполнения скрипта, да и само вермя выполнения относительно долгое. При повторном запуске уменьшается как задержка (практически исчезает), так и время выполнения скрипта. Подчеркну, что я не имею ввиду инкрементальную пересборку, какая например есть в Webpack - я имею ввиду прерывание выполнения скрипта и ручной перезапуск его из консоли.

Всё возвращается на исходные позиции после перезагрузки компьютера, ввода его в ждущий режим или просто если некоторое время не запускать подобные приведённые выше утилиты.

Задержка после запуска скрипта на примере Gulp

После запуска gulp-а на некоторое время консоль подвисает и отображается только введённая команда:

введите сюда описание изображения

Далее по прошествии некоторого времени (секунд 20-30) в консоли уже начинает появляться обратная связь от запущенного скрипта:

введите сюда описание изображения

О воспроизведении

Если я сделаю простой минимальный gulp-проект или webpack-проект и раздам его на GitHub, то он запустится и соберётся за считанные секунды, потому явление снижения время сборки при перезапуске Вы не пронаблюдаете. А дать доступ к реальному проекту, где много файлов, я как Вы понимаете не могу. Поэтому если приведённых ниже экспериментальных данных недостаточно для того, чтобы объяснить, что происходит, значит не судьба.

Снижение время повторной сборки после ручного перезапуска

Ниже приведены экспериментальные данные сборки другого проекта. Сборка проекта тоже основана на Gulp, но там также есть и интегрированный Webpack, и компиляция TypeScript-а.

Основное время занимает сборка файла браузерного приложения FrontEndEntryPoint.js и серверной точки входа BackEndEntryPoint.js. При первом запуске всё это дело собирается порой аж минут 20, но при повторных запусках время сборки падает до порядка одной минуты.

День 1

Попытка 1 После включения компьютера

  • Общее время сборки до автоматического открытия в браузере: 18 минут
  • Сборка FrontEndEntryPoint.js: 841 секунда
  • Сборка BackEndEntryPoint.js: 405 секунд

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

Попытка 2 Последующая

  • Общее время сборки автоматического открытия в браузере: 55 секунд
  • Сборка FrontEndEntryPoint.js: 44 секунды
  • Сборка BackEndEntryPoint.js: 22 секунды

День 2

Попытка 1 После использования компьютера целый день

  • Общее время сборки до автоматического открытия в браузере: 21 с половиной минуты
  • Сборка FrontEndEntryPoint.js: 1074 секунды
  • Сборка BackEndEntryPoint.js: 519 секунд

Попытка 2 Последующая

  • Общее время сборки до автоматического открытия в браузере: 2 минуты 14 секунд
  • Сборка FrontEndEntryPoint.js: 74 секунды
  • Сборка BackEndEntryPoint.js: 73 секунды

В этот раз обе точки входа были собраны почти за одинаковое время, хотя обычно BackEndEntryPoint собирается в 2 раза быстрее FrontEndEntryPoint.js.

Попытка 3 Последующая

  • Общее время сборки до автоматического открытия в браузере: 50 секунд
  • Сборка FrontEndEntryPoint.js: 41 секунда
  • Сборка BackEndEntryPoint.js: 20 секунд

Попытка 4 Последующая

  • Общее время сборки до автоматического открытия в браузере: 56 секунд
  • Сборка FrontEndEntryPoint.js: 43 секунды
  • Сборка BackEndEntryPoint.js: 22 секунды

День 3

Попытка 1 После выхода компьютера из ждущего режима

  • Общее время сборки до автоматического открытия в браузере: 24 минуты
  • Сборка FrontEndEntryPoint.js: 1195 секунды
  • Сборка BackEndEntryPoint.js: 696 секунды

Попытка 2 Последующая

  • Общее время сборки до автоматического открытия в браузере: 2 минуты 45 секунд
  • Сборка FrontEndEntryPoint.js: 72 секунды
  • Сборка BackEndEntryPoint.js: 68 секунды

Попытка 3 Последующая

  • Общее время сборки до автоматического открытия в браузере: 54 секунд
  • Сборка FrontEndEntryPoint.js: 43 секунды
  • Сборка BackEndEntryPoint.js: 22 секунды

Сведения о компьютере

Компьютер отнюдь не слабый (игровой ноутбук):

  • Процессор: Intel(R) Core(TM) i7-8750H @ 2.20 GHz
  • RAM: 16 GB

Никаких других проблем с быстродействием на нём не имеется.

Вопрос

Можете ли Вы сказать, чем объясняются эти явления?

Я сам предполагаю, что первом запуске многие данные запускаемых скриптов кэшируются, потому повторные запуски проходят гораздо быстрее. Однако, если скрипты некоторое время не запускать, то кэш очищается, а потому время запуска и выполнения снова увеличивается.

Но это лишь моё предположение, так как на данный момент принципы работы кэширования в NodeJS мне абсолютно незнакомы.


Ответы (2 шт):

Автор решения: Qwertiy

Этот ответ является предположением и может быть ошибочным

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

→ Ссылка
Автор решения: user7860670

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

  1. заменить hdd на ssd
  2. отключить антивирус, или хотя бы добавить рабочие папки проектов в исключения
  3. нарастить объем оперативной памяти, чтобы данные не так скоро вымывались из памяти
→ Ссылка