Какие основные вещи я могу сделать, чтобы сократить время запуска?
Есть ли на что-то особенное, на что я должен обратить внимание?
Примечание: Время запуска можно уменьшить, реже запуская Emacs (один раз за сеанс) и открывая файлы в работающем экземпляре . Этот вопрос касается минимизации времени запуска, начала сеанса или любого другого времени, когда необходим запуск Emacs.
См. Также тот же вопрос, на который дан ответ в Stack Overflow, с оценками вопросов и ответов более 50 и 30 с некоторыми «любимыми» закладками. Хорошие ответы здесь должны выходить за рамки того, что доступно в переполнении стека.
init-file
performance
start-up
caisah
источник
источник
Ответы:
Вот мои замечания по сокращению
emacs-init-time
, это не распространяется на такие вещи, как использование демона или сервера, само собой разумеется, что вы редко когда-либо закрываете emacs.Не рекомендуется:
Не требуйте пакетов в вашей инициализации, если пакет не имеет надлежащих файлов автозагрузки, убедитесь, что вы настроили автозагрузку в командах ввода. Так что, если вы в первый раз используете package
foobar
при вызове,foobar-mode
аfoobar
он не был предварительно загружен, вам понадобится что-то вроде этого:это позволит вам звонить,
foobar-mode
даже еслиfoobar
пакет еще не был загружен. Этот способfoobar
не будет загружен, пока вы на самом деле не позвонитеfoobar-mode
Не запускайте,
package-refresh-contents
если вам не нужно устанавливать пакеты при запуске. Если ваш init настроен на автоматическую установку отсутствующих пакетов, рассмотрите возможность установки аргумента командной строки, чтобы вы могли указать, когда должна происходить автоматическая установка.desktop
init, если вы действительно этого не хотите.Делать
Используйте что-то вроде
use-package
управления своими пакетами. Это позволяет легко указать, что требуется, что загружать позже, что загружать автоматически и что упрощает профилирование вашего init для каждого пакета.Знайте разницу между загрузкой темы и ее включением. Короче говоря, вы можете загрузить столько, сколько хотите, но убедитесь, что вы не включаете более одного. В идеале загружайте и включайте только одну тему.
load-theme
нужен необязательный аргумент arg для предотвращения включения темы. Может быть легко случайно включить несколько тем, что медленно и безобразно во время запуска.Делать чит: часто бывают большие глобальные режимы, которые вы хотите загрузить при инициализации, такие как отмена дерева, автозаполнение, режим ido и т. Д. Убедитесь, что у функций ввода есть настройка автозагрузки, затем запустите таймеры простоя в вашем init для загрузки пакетов , Я делаю эту волю
undo-tree-mode
,ido
и другие и никогда не замечают задержку , потому что к тому времени , я на самом деле нужно использовать их, они уже загружены.Обновление: use-package немного изменился, прочитайте официальный readme перед тем, как начать использовать функции таймера.
Например: если вы хотите немного отложить загрузку,
global-undo-tree-mode
вы можете поместить это в свой init:Теперь ваша инициализация может продолжаться счастливо и
global-undo-tree-mode
фактически не будет активирована, пока все остальное не будет готово, и вы не сядете за руль.use-package
имеет поддержку такого поведения, встроенную с помощью ключевого слова: idle. Вотundo-tree
конфиг из моего .init.el:Сделайте профиль вашей инициации, всегда удивительно видеть, где реальные замедления. profile-dotemacs.el - это невероятный инструмент, который я использовал, чтобы помочь мне снизить скорость инициализации с ~ 6 секунд до <1 секунды.
Хорошо сконфигурированный
use-package
init может быть невероятно быстрым. Я не байт-компилирую свой init, и он используетuse-package
для настройки 95 пакетов и запускается через <1 секунду.источник
(require 'org)
линия. :-)(run-with-idle-timer 1 nil #'global-undo-tree-mode)'. If the function you are loading takes parameters you can just provide them after the
команда #.Что-то, что недавно появилось в emacs reddit : уменьшите количество вызовов сборки мусора, поместив это в начале вашего файла инициализации:
В приведенном выше примере GC вызывается каждые ~ 50 МБ (вместо значения по умолчанию ~ 800 КБ), что представляется разумным в современной системе с большим количеством оперативной памяти.
источник
emacs-startup-hook
это хорошее место для этого.Время, которое вы тратите на оптимизацию времени запуска, вероятно, будет больше, чем все дополнительное время, которое вы ожидали бы при запуске Emacs.
На данный момент я делаю 25
require
вызовов в моем файле инициализации, чтобы Flycheck мог найти орфографические ошибки в моем коде. Мое время запуска ...Кроме того, в моей системе
time emacs -Q --eval '(save-buffers-kill-terminal)'
естьreal
из0m0.404s
. Теоретическое максимальное количество времени, которое я могу сэкономить, составляет 2,3 секунды.Скажем, я потратил час на внесение изменений в мой файл инициализации. (Я не буду считать дополнительные 15-30 минут, потраченные на более позднюю дату, пытаясь выяснить, почему мои изменения не вступили в силу из-за того, что мой файл инициализации был побитно скомпилирован.) (Я также не буду считать время, которое Flycheck спас бы меня в отладчике, если бы я не удалял
require
вызовы.) В часе 3600 секунд, поэтому, если бы мне удалось сэкономить все 2,3 секунды, мои затраты на время окупились бы только после 1565 запусков.Предполагая, что я перезапускаю Emacs 3 раза в день, каждый день, чтобы эти инвестиции окупились, понадобится полтора года. Если бы я оставлял один и тот же экземпляр Emacs на несколько дней подряд (как я это часто делаю), я бы, вероятно, перезапускал только 2-5 раз в неделю, и в этом случае эти инвестиции окупились бы от 6 до 15 лет.
Я щедрый, потому что вы, скорее всего, потратите больше часа на оптимизацию своего стартапа, и вы, вероятно, не сэкономите максимальное теоретическое количество секунд.
источник