#ruby #import #require #standard-library
#рубин #импорт #требовать #стандартная библиотека #ruby #требует #standard-library
Вопрос:
Когда я задаю этот вопрос, я имею в виду именно ruby, но если ответ не зависит от языка, я тоже хотел бы знать.
Я часто require
использую стандартную библиотеку ruby, а именно fileutils
, open3
и pathname
.
Но если мне нужно использовать их возможности только в одной или двух строках, я избегаю их и выбираю (иногда менее читаемые) альтернативы, которым не нужен require
.
Однако их использование, похоже, не влияет на производительность моих скриптов, и даже при быстрых тестах (с использованием time
) все работает с той же скоростью, что и при использовании других методов. Но мне кажется странным, что это не имело бы никакого значения, потому что зачем тогда их require
использовать совместно (а не просто включать сразу)? Итак, конкретные вопросы:
- Делает ли импорт из стандартной библиотеки скрипты медленнее?
- Если да, то всегда ли это незначительно, или это зависит от упаковки?
- Как насчет пакетов сторонних производителей? Импортируются ли они медленнее, чем те, что есть в стандартной библиотеке?
Комментарии:
1. Насколько мне известно, Ruby не загружает библиотеки с отложенной загрузкой, поэтому определенно будут некоторые накладные расходы. Что касается стандартной библиотеки, я предполагаю, что Ruby отправляет их как dylibs (хотя это предположение), поэтому накладных расходов будет очень мало.
Ответ №1:
Импорт библиотеки займет ненулевое количество времени, но это количество времени прямо пропорционально тому, какая библиотека. Некоторые из них очень маленькие, некоторые намного больше, но все те, что поставляются с Ruby, обычно быстро загружаются.
Если вы не запускаете свой скрипт тысячу раз в секунду, воздействие require
будет минимальным.
Обычно лучше как можно раньше завершить все require
операции, чтобы устранить любые проблемы с зависимостями, особенно с gems. Нет ничего хуже, чем сбой кода из-за нарушенной зависимости, но только при выполнении определенного действия, которое происходит не часто.
Если вы запускаете этот процесс тысячи раз, используйте такой инструмент, как Spring, или свою собственную модель разветвления, чтобы избежать штрафа при запуске. Вы можете fork
запускать предварительно настроенный процесс любое количество раз, каждый из которых будет готов почти мгновенно.
Ответ №2:
При использовании require
вы указываете Ruby загрузить какой-либо файл (ваш собственный файл, стандартную библиотеку или внешнюю библиотеку).
Так что да, требуется время, чтобы найти и загрузить его.
Но требуемый файл загружается только один раз (обычно при запуске, потому что обычно require
находится в верхней части файла).
Загружает заданное,
name
возвращаяtrue
в случае успеха иfalse
если функция уже загружена.В
$LOADED_FEATURES
($"
) добавляется абсолютный путь к загруженному файлу. Файл не будет загружен снова, если его путь уже указан в$"
И затраченное время зависит от размера файла и размера связанных файлов.