Как Emacs запускается мгновенно со многими el-файлами?

11

Как знает каждый Emacs'er, в настоящее время я страдаю от своей обширной конфигурации dot-Emacs. Все мои пакеты находятся в контейнерах use-package, и я скомпилировал все мои .el-файлы. Несмотря на это, Emacs запускается через 6,4 секунды, а затем загружает остальные пакеты (около 40 из них).

Я думал о других способах решения долгого времени запуска, затем я кое-что заметил. Emacs по умолчанию (без пользовательской конфигурации) использует много .elбиблиотек, которые включены в каждый Emacs. Они расположены в \shares\emacs\version number\lisp\.

Даже с большим количеством файлов lisp, ему удается начать в одну секунду. Когда я проверял файлы многих пакетов, которые включены в Emacs по умолчанию, я не нашел ничего экстраординарного, который мог бы объяснить, почему Emacs удается запустить в течение одной секунды. Может кто-нибудь сказать мне, как Emacs управляет этим, даже с тысячами .elфайлов?

ReneFroger
источник
1
Используете ли вы :defer tв своих use-packageдекларациях, где это возможно?
lunaryorn
7
Многочисленные базовые библиотеки в Emacs предварительно загружаются в исполняемый файл с помощью механизма дампа , используемого при сборке Emacs, что также создает иллюзию того, что многие вещи загружаются невероятно быстро. Посмотрите C-h i g (elisp) Building Emacs, хотите ли вы узнать об этом.
Фил
2
@phils: Было бы здорово, если бы вы могли расширить свой комментарий до ответа, похоже, что механизм дампа еще не упоминался в Emacs-SE.
паприка
а
мне
паприка: Готово ..
Филс

Ответы:

9

Может кто-нибудь сказать мне, как Emacs управляет этим, даже с тысячами .el-файлов?

Emacs "управляет" этим, не загружая при запуске, тем самым не задерживая загрузку основного приложения. Это, в свою очередь, как результат более быстрого возврата управления с клавиатуры на пользователя.

Но когда он загружен? При первом использовании этой функции, режима или функции.

Разве это не замедляется? Да, при первом использовании. Это компромисс. Вы хотите замедлить работу во время запуска emacs или при первом использовании.

Это заметно? Загрузка во время запуска, кажется, занимает больше времени, так как загружаются и другие основные библиотеки. Но при первом использовании он чувствует себя быстрее, так как загружается только функция подмножества.

Тогда зачем кому-то выбирать нагрузку при запуске? Потому что некоторые не против дождаться загрузки всех часто используемых библиотек при запуске, поэтому после загрузки все операции выполняются быстро после этого.

Как я могу выбрать? Как указывали Дрю и другие в своих ответах на этот вопрос, вы можете использовать автозагрузку и аналогичные приемы для контроля. Но самым важным фактором должен быть ваш шаблон использования. Если вам случится использовать emacs, такой как vi, постоянно открывающийся и закрывающийся, да, время запуска становится болезненно очевидным. Но с другой стороны, если вы используете emacs, работающий все время, время запуска в 1 секунду или 1 минуту не будет настолько заметным или достаточно важным, чтобы об этом беспокоиться.

Обратите внимание, что вы можете использовать пакетный режим или Zile для мгновенного запуска во время тестирования, запуска или иного использования emacs, например, vi.

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

Пользователь Emacs
источник
10

Многие из включенных библиотек не загружаются при запуске.

Некоторые команды и т. Д. Загружаются автоматически , это означает, что Emacs распознает их и знает, как их загрузить. Когда вы пытаетесь использовать команду, которая загружается автоматически, Emacs загружает библиотеку, которая ее определяет, если она еще не загружена.

Вы можете создавать свои собственные автозагрузки, будь то для ваших собственных команд или команд в библиотеках, которые вы не написали. См. Руководство Elisp, узел Автозагрузка .

Нарисовался
источник
Я полагаю, это так же известно, как ленивая загрузка. Есть ли какой-нибудь пример, как достигается отложенная загрузка, которая будет загружаться только тогда, когда она вызывается?
ReneFroger
Не уверен, что вы спрашиваете. Да, это можно назвать ленивой загрузкой. В руководстве Elisp есть примеры и объяснения. Добавление cookie для автозагрузки ( ;;;###autoload) непосредственно перед определением команды в вашей библиотеке - это один из способов дать ей определение автозагрузки, гарантируя, что ее библиотека будет загружена, когда кто-то ее вызовет.
Дрю
... но прочитайте эту ссылку, чтобы понять, как / если обрабатываются эти файлы автозагрузки. Менеджер пакетов обрабатывает их для всех пакетов ELPA. В противном случае вы бы позвонили (autoload...)прямо в файл инициализации, чтобы зарегистрировать их.
Фил
Спасибо за ваши оба ответа, это очень помогло узнать больше об этом!
ReneFroger
9

В дополнение к другим ответам (которые объясняют, как большинство библиотек фактически загружаются только по требованию), существует также вопрос предварительной загрузки многих основных библиотек elisp в самом emacsисполняемом файле, что создает иллюзию загрузки много чего невероятно быстро.

Это достигается за счет работы так называемой «голой» версии Emacs (который является то , что было на самом деле составлен, и который является полностью функциональным, но содержит только Elisp интерпретатор и другие основные функции , написанные на C), и сказать , что нагрузка все библиотеки elisp, которые должны быть предварительно загружены, прежде чем, наконец, «выгрузить» реальный emacsдвоичный файл с этими встроенными библиотеками.

Этот механизм подробно описан в руководстве elisp:
C-hig (elisp) Building Emacs RET

Если вы сами скомпилировали Emacs, вы можете поэкспериментировать с этим процессом и даже вывести дамп альтернативных версий конечного исполняемого файла, если хотите (обычно не рекомендуется, но средство есть).

Скомпилированный temacsдвоичный файл можно найти в srcкаталоге, и вы можете сравнить разницу во времени запуска, запустив каждую версию следующим образом:

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

В моей системе первый занимает ~ 4 секунды (в течение которого загружается 111 библиотек elisp), а второй - ~ 0,02 секунды.

Phils
источник
Очень приятно @phils за эту мысль.
Пользователь Emacs