Emacs の起動時間を 1 秒にしたい (結果: 14 秒 → 4 秒)
現状: 素の Emacs と比べてあまりにも遅い
rust-analyzer
の crates/hir-def/src/lib.rs
を引数に Emacs を起動すると、 14 秒かかりました。何とかしたい!
参考にする予定:
過去の対策
- 起動時の GC 容量を大きくした
-
lsp-mode
の設定をした (lsp-doctor, バッファサイズや lsp-deferred) -
leaf.el
を使った (パッケージの遅延読み込みがデフォルトになった) -
early-init.el
で効果的に一部 UI を無効化した
改善の手を探る
Emacs 28 に更新
Homebrew 自体を更新しておらず、全体的に古いパッケージを使っていたようです。不覚!
$ brew up
$ brew install emacs-plus
Emacs の起動時間は 9 秒になりました。そんなに変わるかな……? 使っていないはずの Treemacs の警告がステータスバーに流れます。これは改善の余地あり。
プロファイリング
関数を頂きました:
プロファイル結果を grep すると、余計なものを読み込み過ぎだと分かります:
大半のパッケージは遅延ロードされており、表示上 0 秒で読み込まれています。
- 余計なパッケージのロードを止める
- 起動中のメッセージ表示を抑制してみる
- Evil 関係の設定をタイマーで遅延ロードしてみる
- 設定ファイルをバイトコンパイルしてみる
遅延ロード
プロファイリング関数 のおかげで、ロードの遅い関数をリストできました。 1 つずつ遅延ロードしていきます。
org-mode
関係
Consult の source を (一旦) 削除
org-buffer-source
を作って consult-buffer-sources
に追加しているのですが、これが org-buffer-list
を呼ぶために org-mode
の読み込みに繋がっています。
一旦 org-buffer-source
を無効化しました。本来は consult のバッファ作成の方が遅延されるべきですが、もう org-mode
を使っていないので、遅延盆栽でいきましょう。
rustic-babel.el
の読み込みを防ぐ
rustic
が rustic-babel
を読み込み、 rustic-babel
が org-mode
を読み込んでいます。
(leaf rustic
:custom (rustic-load-optional-libraries . nil)
;; ~~~~
)
org
以外の関連パッケージのロードも無くなりました。これが一番効きました。
lsp-mode
関係
lsp-mode
が起動すると問答無用でロードされています。一旦手動でアンインストールしました。
-
lsp-dart
+ Treemacs (アウトライン表示に使われています) ccls
feather
パッケージのインストールとコンパイルを並列化してくれるパッケージです。初回起動後は無効化すべきですが、失敗しています。
dashboard
ファイルが開かれていないとき、つまり *scratch*
バッファが開かれている時はロードしないことにします:
(leaf dashboard
:config
;; ~~~~
;; Load the dashboard only when no file is open
(when (string= (buffer-name) "*scratch*")
(dashboard-setup-startup-hook)))
なぜか dashboard が開かなくなっている気もします。別件の問題ということで……
結果
4 秒で起動するようになりました。残りはこんな感じです:
テーマの呼び込みは 0.1 秒後、のようにタイマーを設定しても良いかもしれません。
バイトコンパイル (失敗)
関数呼び出しを静的に解決できないファイル構成になっていて、実行時に死にました。
対策として考えられるのは、
- 依存パッケージを
require
/autoload
して静的に解決する - 1 枚の
init.el
にして全部スコープに入れる-
org-mode
でinit.el
を書いて他の.el
ファイルを#+INCLUDE
する - 自力で連結した
init.el
を読み込む
-
設定ファイルをちゃんとしたパッケージにする必要は無いので、 1 枚に連結する方を試してみたいと思います。
疑似非同期ロード (失敗)
特にスピード感が変わらなかったのと、 Consult のセットアップで失敗しました (補完候補が出て来ない) 。
以上!
鈍重 Emacs を脱しました。爆速 Emacs はかなり難しそうです。ここで折れます。
凡人としては、自分は大したナードではないと認めることが大切です (?) 。
後日談
全体的な操作が軽くなりました。やはり rustic-load-optional-libraries
を nil
にしたのが効いた気がします。