Давно уже не трогал свой конфиг, но вдруг приспичило решить давнюю проблему: долгий старт emacs desktop.
У меня сессия фактически вечная, и в ней ~500 файл-буферов.
Это и на современном ПК требует минуты две, чтобы завести emacs --daemon, а на Atom Z520 все пятнадцать.
Покурил код desktop, оказывается у него есть донельзя полезная функция отложенной загрузки desktop-idle-create-buffers.
(setq desktop-restore-eager 30) ;; restore first (last used) 30 buffers
(setq desktop-lazy-idle-delay 5) ;; lazily restore the rest
Казалось бы, отлично: сервер подрывается с готовыми 30ю последними буферами, и тихонько грузит остаток в фоне.
Но нет, на подгружаемые таким образом буферы срабатывают все хуки и тянется это тоже вечность.
После профайла оказалось, что дохрена времени тратится на flycheck новых буферов.
Отключил его в конфиге, но оказалось у desktop нет хука по завершению desktop-idle-create-buffers.
Попробовал завернуть в defadvice, но почему-то after не срабатывает.
В результате набыдлокодил вот это:
(defvar post-init-timer nil
"Timer used to track desktop lazy load progress")
(defun check-lazy-load-complete ()
"Check if desktop finished resurrecting all buffers"
(if (not desktop-buffer-args-list) (desktop-full-lazy-load-complete)))
(defun desktop-full-lazy-load-complete ()
"Hook function executed after desktop lazy load is completed"
(cancel-timer post-init-timer) ;; stop timer
(message "Emacs ready in %s with %d garbage collections."
(format "%.2f seconds"
(float-time
(time-subtract (current-time) before-init-time)))
gcs-done)
;; Return to defaults after startup
(setq gc-cons-threshold gc-cons-threshold-original)
(setq gc-cons-percentage gc-cons-percentage-original)
;; Don’t compact font caches during GC.
(setq inhibit-compacting-font-caches t) ;; Emacs 25.2 or later
(global-flycheck-mode t)
(garbage-collect))
(setq post-init-timer (run-with-timer 60 5 'check-lazy-load-complete))
В начале конфига, соответственно:
;;; Call GC only once per 500M words (500Mb on x86 and 1000Mb on amd64) of allocations
(setq gc-cons-threshold-original gc-cons-threshold) ;; save defaults
(setq gc-cons-percentage-original gc-cons-percentage) ;; save defaults
(setq gc-cons-threshold 524288000)
(setq gc-cons-percentage 10)
Что имеем: за несколько секунд подрывается сервер с 30ю последними буферами и сразу доступен.
Дальше без перерывов на сборку мусора и флайчек подсасываем остальные полтыщи.
После чего включается флайчек и возвращаются стандартные настройки сборщика.
В сухом остатке многострадальный Atom Z520 заливает в себя полную сессию всего за 4 минуты, а доступен практически сразу, вместо 15и минут медитации.
Успех.
P.S. как истинный емаксер елиспа я до сих пор не знаю.