Closed9

Emacs の起動時間を 1 秒にしたい (結果: 14 秒 → 4 秒)

toyboot4etoyboot4e

過去の対策

  • 起動時の GC 容量を大きくした
  • lsp-mode の設定をした (lsp-doctor, バッファサイズや lsp-deferred)
  • leaf.el を使った (パッケージの遅延読み込みがデフォルトになった)
  • early-init.el で効果的に一部 UI を無効化した
toyboot4etoyboot4e

改善の手を探る

Emacs 28 に更新

Homebrew 自体を更新しておらず、全体的に古いパッケージを使っていたようです。不覚!

$ brew up
$ brew install emacs-plus

Emacs の起動時間は 9 秒になりました。そんなに変わるかな……? 使っていないはずの Treemacs の警告がステータスバーに流れます。これは改善の余地あり。

プロファイリング

関数を頂きました:

https://zenn.dev/zk_phi/books/cba129aacd4c1418ade4/viewer/4d0a9dde1043c6eaffad

プロファイル結果を grep すると、余計なものを読み込み過ぎだと分かります:

大半のパッケージは遅延ロードされており、表示上 0 秒で読み込まれています。

toyboot4etoyboot4e
  • 余計なパッケージのロードを止める
  • 起動中のメッセージ表示を抑制してみる
  • Evil 関係の設定をタイマーで遅延ロードしてみる
  • 設定ファイルをバイトコンパイルしてみる
toyboot4etoyboot4e

遅延ロード

プロファイリング関数 のおかげで、ロードの遅い関数をリストできました。 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 の読み込みを防ぐ

rusticrustic-babel を読み込み、 rustic-babelorg-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 秒後、のようにタイマーを設定しても良いかもしれません。

toyboot4etoyboot4e

バイトコンパイル (失敗)

関数呼び出しを静的に解決できないファイル構成になっていて、実行時に死にました。

対策として考えられるのは、

  • 依存パッケージを require / autoload して静的に解決する
  • 1 枚の init.el にして全部スコープに入れる
    • org-modeinit.el を書いて他の .el ファイルを #+INCLUDE する
    • 自力で連結した init.el を読み込む

設定ファイルをちゃんとしたパッケージにする必要は無いので、 1 枚に連結する方を試してみたいと思います。

toyboot4etoyboot4e

以上!

鈍重 Emacs を脱しました。爆速 Emacs はかなり難しそうです。ここで折れます。

凡人としては、自分は大したナードではないと認めることが大切です (?) 。

toyboot4etoyboot4e

後日談

全体的な操作が軽くなりました。やはり rustic-load-optional-librariesnil にしたのが効いた気がします。

このスクラップは2022/07/04にクローズされました