Глядя на ваш основной вопрос:
Является ли package require
быстрее, чем source
?
Их нельзя сравнивать напрямую.
Пакеты представляют собой концепцию более высокого уровня, чем файлы сценариев, которые вы можете source
, и часто реализуются с помощью source
файла или нескольких. Существует также механизм кеширования, так что, хотя в первый раз вы выполняете package require
, он будет определенно значительно медленнее, чем source
(поскольку подсистема управления пакетами должна искать пакеты, которые у вас есть, если это не так. узнайте тот, который вы запрашиваете, что на самом деле включает использование source
в довольно большом количестве pkgIndex.tcl
файлов), последующие вызовы package require
, вероятно, будут быстрее, поскольку пакеты не загружаются дважды. После того, как внутренний индекс построен (обычно один раз для каждого интерпретатора), package require
из известного, но не загруженного пакета не намного медленнее, чем source
непосредственное использование файлов его реализации. За исключением того, что происходит «более высокий уровень»: пакет может вообще не быть реализован с помощью source
, а вместо этого может использовать load
библиотеки DLL. Или это может быть микс. Это бизнес пакета: все, что вам обычно нужно знать, - это то, что у функции есть имя и версия. Это контрастирует с прямым source
, где вам нужно точно знать, где находится код (хорошо, легко, если он находится в известном фиксированном месте или расположен относительно текущего скрипта), а также что этот файл - именно то, что вам нужно. В общем, лучше отделить политику (например, package require foobar 1.2.3
) от реализации (например, source -encoding utf8 /usr/local/lib/tcl/packages/foobar_1.2.3/foobar.tcl
).
Следствием того, что пакеты являются одноразовыми, является то, что они не предназначен для создания экземпляров объектов и объектно-подобных вещей (за исключением тех, которые эффективно документированы синглтонами в API). Вы package require
получаете команды построения (которые могут быть классами), а затем используете эти команды для создания экземпляров, которые вам нужны, когда они вам нужны.