Как знает каждый Emacs'er, в настоящее время я страдаю от своей обширной конфигурации dot-Emacs. Все мои пакеты находятся в контейнерах use-package
, и я скомпилировал все мои .el
-файлы. Несмотря на это, Emacs запускается через 6,4 секунды, а затем загружает остальные пакеты (около 40 из них).
Я думал о других способах решения долгого времени запуска, затем я кое-что заметил. Emacs по умолчанию (без пользовательской конфигурации) использует много .el
библиотек, которые включены в каждый Emacs. Они расположены в \shares\emacs\version number\lisp\
.
Даже с большим количеством файлов lisp, ему удается начать в одну секунду. Когда я проверял файлы многих пакетов, которые включены в Emacs по умолчанию, я не нашел ничего экстраординарного, который мог бы объяснить, почему Emacs удается запустить в течение одной секунды. Может кто-нибудь сказать мне, как Emacs управляет этим, даже с тысячами .el
файлов?
:defer t
в своихuse-package
декларациях, где это возможно?C-h i g (elisp) Building Emacs
, хотите ли вы узнать об этом.Ответы:
Emacs "управляет" этим, не загружая при запуске, тем самым не задерживая загрузку основного приложения. Это, в свою очередь, как результат более быстрого возврата управления с клавиатуры на пользователя.
Но когда он загружен? При первом использовании этой функции, режима или функции.
Разве это не замедляется? Да, при первом использовании. Это компромисс. Вы хотите замедлить работу во время запуска emacs или при первом использовании.
Это заметно? Загрузка во время запуска, кажется, занимает больше времени, так как загружаются и другие основные библиотеки. Но при первом использовании он чувствует себя быстрее, так как загружается только функция подмножества.
Тогда зачем кому-то выбирать нагрузку при запуске? Потому что некоторые не против дождаться загрузки всех часто используемых библиотек при запуске, поэтому после загрузки все операции выполняются быстро после этого.
Как я могу выбрать? Как указывали Дрю и другие в своих ответах на этот вопрос, вы можете использовать автозагрузку и аналогичные приемы для контроля. Но самым важным фактором должен быть ваш шаблон использования. Если вам случится использовать emacs, такой как vi, постоянно открывающийся и закрывающийся, да, время запуска становится болезненно очевидным. Но с другой стороны, если вы используете emacs, работающий все время, время запуска в 1 секунду или 1 минуту не будет настолько заметным или достаточно важным, чтобы об этом беспокоиться.
Обратите внимание, что вы можете использовать пакетный режим или Zile для мгновенного запуска во время тестирования, запуска или иного использования emacs, например, vi.
Я предпочитаю загружаться при запуске, чтобы любые ошибки были обнаружены заранее. Я предпочитаю не сталкиваться с ошибками загрузки в самый разгар рабочего дня, когда у меня активны бесчисленные буферы, режимы и состояния компиляции, а также несколько удаленных мест, управляемых TRAMP. Отладка ошибок автозагрузки в таких условиях не очень приятна.
источник
Многие из включенных библиотек не загружаются при запуске.
Некоторые команды и т. Д. Загружаются автоматически , это означает, что Emacs распознает их и знает, как их загрузить. Когда вы пытаетесь использовать команду, которая загружается автоматически, Emacs загружает библиотеку, которая ее определяет, если она еще не загружена.
Вы можете создавать свои собственные автозагрузки, будь то для ваших собственных команд или команд в библиотеках, которые вы не написали. См. Руководство Elisp, узел Автозагрузка .
источник
;;;###autoload
) непосредственно перед определением команды в вашей библиотеке - это один из способов дать ей определение автозагрузки, гарантируя, что ее библиотека будет загружена, когда кто-то ее вызовет.(autoload...)
прямо в файл инициализации, чтобы зарегистрировать их.В дополнение к другим ответам (которые объясняют, как большинство библиотек фактически загружаются только по требованию), существует также вопрос предварительной загрузки многих основных библиотек elisp в самом
emacs
исполняемом файле, что создает иллюзию загрузки много чего невероятно быстро.Это достигается за счет работы так называемой «голой» версии Emacs (который является то , что было на самом деле составлен, и который является полностью функциональным, но содержит только Elisp интерпретатор и другие основные функции , написанные на C), и сказать , что нагрузка все библиотеки elisp, которые должны быть предварительно загружены, прежде чем, наконец, «выгрузить» реальный
emacs
двоичный файл с этими встроенными библиотеками.Этот механизм подробно описан в руководстве elisp:
C-hig
(elisp) Building Emacs
RETЕсли вы сами скомпилировали Emacs, вы можете поэкспериментировать с этим процессом и даже вывести дамп альтернативных версий конечного исполняемого файла, если хотите (обычно не рекомендуется, но средство есть).
Скомпилированный
temacs
двоичный файл можно найти вsrc
каталоге, и вы можете сравнить разницу во времени запуска, запустив каждую версию следующим образом:В моей системе первый занимает ~ 4 секунды (в течение которого загружается 111 библиотек elisp), а второй - ~ 0,02 секунды.
источник