Чтобы дать некоторый контекст, мне интересно узнать, как оптимизировать время холодного запуска приложения Node.js Express, работающего на Google Cloud Function.
До сих пор я узнал, что самый большой штраф за холодные ботинки - это загрузка зависимостей с использованием запросов. Как инженер-программист научный ум говорит мне, что он будет основан на количестве файлов, размере файлов, количестве зависимостей, кешировании. Однако, возможно, оптимизация - это скорее искусство, чем наука, поэтому любые рекомендации или отзывы от вашего собственного опыта наиболее ценятся.
Мои вопросы:
Если я окружаю const x = require('x')
с двумя операторами process.hrtime()
и измеряю разницу во времени, я буду измерять время загрузки для всего времени загрузки пакета "x"?
Если это так, включает ли это загрузку всех файлов в этом пакете? Как насчет зависимостей этого пакета requires-, когда они загружаются (что приводит к третьему вопросу 3).
Если требование require находится внутри условного блока, например if (condition) { const x = require('x'); }
if (condition) { const x = require('x'); }
, в какой момент он "загружен" и что означает "загруженный" (т.е. в памяти, анализируется, выполняется и т.д.)? Будет ли это нагрузка "на данный момент во время выполнения достигается утверждение (или нет), или будет require
происходить независимо, когда программа начинает выполнение?
Да, require
- это просто нормальная функция, которая возвращает модуль, если он в памяти, или загружает его, если это не так, что означает чтение файла, его анализ и выполнение (и, конечно, это может потребовать других зависимостей).
Там нет проблем с бенчмаркингом (просто убедитесь, что вы измеряете первое требование файла, так как модуль кэшируется).
Если require
находится в вашем файле, но не выполняется (например, потому что оно находится за оператором if
), оно не будет иметь никакого эффекта, чем если бы оно не было в вашем файле. И загрузка не произойдет до того, как будет достигнуто утверждение.