TL; DR У меня такое огромное количество пакетов, что это мешает моему запуску. Если вы не верите в это, читайте дальше.
Время запуска моего Emacs довольно мало. Я не пользуюсьuse-package
, я просто установил тонны хуков и autoload
s, чтобы почти весь код был отложен. На самом деле все загружается менее чем за полсекунды, несмотря на то, что это выглядит как сумасшедший беспорядок.
Тем не менее, со временем я заметил, что мое время запуска становится немного медленнее, необъяснимым образом. Это в конечном итоге дошло до того, что время запуска ≥ 1 секунды. Мне наконец то надоело и я в корне закопался в проблеме. В конце концов я закомментировал весь ~/.emacs
файл и обнаружил, что время запуска все еще составляло ≥ 1 секунды. На самом деле, он только сбрил ~ 0.2
секунды, иногда даже меньше. Затем я попытался emacs -q
и обнаружил, что время запуска было ~0.1
секунд.
Изучив этот раздел руководства Elisp, я выяснил, почему emacs -q
так сильно сокращается время запуска. По-видимомуemacs -q
мешает Emacs делать три вещи при запуске:
- загрузка вашего файла инициализации
- загружая ваш
default.el
файла - призвание
package-initialize
Мы уже исключили мой файл инициализации, поскольку комментирование всего моего файла ~/.emacs
почти ничего не делает. Я не использую default.el
файл, так что это также исключено. Который оставляет package-initialize
в качестве виновника удара производительности.
Зачем package-initialize
занимать так много времени запуска? Это был первый вопрос, который я задал себе. Разве я не загружаю все? Ну да. Но это именно проблема.
Я нашел этот пост который объясняет, что «активация» пакетов состоит из чтения файлов автозагрузки и установки путей загрузки. Это, очевидно, влечет за собой штраф ввода-вывода, когда у вас много пакетов, потому что у вас есть много файлов автозагрузки для чтения и множество путей для установки. К сожалению, без этого задача управления автозагрузками попадает в руки пользователя. Другими словами, не позволяя package.el
сканировать файловую систему для автозагрузки файлов и путей, мне пришлось бы самому управлять этим, что может быть утомительным и подверженным ошибкам процессом.
Я бы предпочел не идти по этому пути. В настоящее время у меня 116 пакетов, из которых 107 из ELPA и 25 из которых являются зависимостями. Я уверен, что это колоссальное число - то, что так сильно ухудшает мою производительность. Но я в затруднительном положении, потому что я не хочу удалять ни один из своих пакетов.
Есть ли какое-либо средство в такой ситуации, чтобы вернуть время молниеносного запуска?
Обновить:
Мы начали новый поток на emacs-devel
список рассылки о некоторых пластырей по Стефан Монье (описание этих патчей здесь ) , чтобы решить эту проблему. Любой желающий может проверить свои патчи и дать отзыв.
Еще одно обновление:
Похоже, что Стефан Моннье либо не заинтересован в этом вопросе, либо не получает мои сообщения. Я склонен верить первому, что хорошо, хотя я был бы признателен за какой-то ответ от него, если это так. Во всяком случае, код, который он создал для этой проблемы, пока работает довольно хорошо. Самые последние его патчи можно найти здесь (для Emacs 25.3) и здесь (для основной ветки Emacs).Благодаря его исправлениям я увидел хорошие улучшения во время запуска, и теперь я чувствую себя комфортно со временем запуска, так как оно максимально оптимизировано без потери возможностей моей настройки. Я надеялся, что эти патчи в какой-то момент попадут в магистраль Emacs, но я думаю, что мне (или кому-то еще) придется вместо этого взять факел вместо Стефана. У нас был небольшой спар в списке рассылки о передаче авторских прав и лицензировании. Сначала я чувствовал себя неловко, но из-за некоторых комментариев Ричарда Столлмана и других авторское право может быть не таким ограничительным, как я первоначально думал. Более того, для меня может быть возможность передать свои работы в общественное достояние в качестве альтернативы передаче авторских прав.
В любом случае, спасибо Стефану за патчи! Я надеюсь, что вы продолжите развивать эти изменения, но если нет, то все в порядке, и я могу продолжить развивать их в какой-то момент. Я также благодарю всех, кто предложил понимание и вклад в решение этой проблемы.
Еще одно обновление:
Ух ты, похоже, эта функция наконец-то появилась и будет в Emacs 27. Спасибо Стефану Моннье!
use-package
это способ пойти на это.