Emacsはどのようにして多くのelファイルで瞬時に起動するのですか?


11

すべてのEmacs'erが知っているように、私は現在、広範なドットEmacs構成に苦しんでいます。私のすべてのパッケージはのコンテナ内にありuse-package、すべての.elファイルをバイトコンパイルしました。それでも、Emacsは6.4秒で起動し、その後残りのパッケージ(そのうちの約40)をロードします。

長い起動時間を解決する別の方法を考えていたところ、何かに気づきました。デフォルトのEmacs(ユーザー構成なし)は.el、すべてのEmacsに含まれている多くのライブラリーを使用します。それらはにあり\shares\emacs\version number\lisp\ます。

多くのlispファイルがあっても、1秒で開始できます。デフォルトのEmacsに含まれている多くのパッケージのファイルを調べていたところ、Emacsが1秒以内に起動する理由を説明できる異常なものは何も見つかりませんでした。何千もの.elファイルがあったとしても、Emacsがそれをどのように管理しているかを誰かに教えてもらえますか?


1
宣言で可能な限り使用:defer tしますuse-packageか?
lunaryorn

7
Emacsの多数のコアライブラリは、Emacsをビルドするときに使用されるダンプメカニズムを介して実行可能ファイルにプリロードされます。参照してください。あなたはそれについての学習に興味があるなら。C-h i g (elisp) Building Emacs
phils 2015

2
@phils:コメントを回答に拡張できればすばらしいでしょう。ダンプのメカニズムはEmacs-SEではまだ言及されていないようです。
パプリカ2015

鉱山は76

パプリカ:完了..
phils 2015

回答:


9

Emacsがそれをどのように管理しているか、何千もの.elファイルがあっても教えてもらえますか?

Emacsは、起動時にロードしないことでコアアプリケーションのロードを保持しないことを「管理」します。これは、キーボードコントロールをユーザーにすばやく返す効果として機能します。

しかし、いつ読み込まれるのでしょうか?その機能、モード、または機能の最初の使用時。

遅くなりませんか?はい、初めて使用します。それはトレードオフです。emacsの起動時または最初の使用時に速度を落としますか?

目立ちますか?他のコアライブラリも読み込まれるため、起動時の読み込みに時間がかかるようです。しかし、最初の使用では、そのサブセット機能のみがロードされるため、速度が速くなります。

では、なぜ起動時に負荷を選択するのでしょうか。起動時に頻繁に使用されるすべてのライブラリのロードを待つことを気にしない人もいるので、一度ロードされると、その後すべての操作が素早く実行されます。

どうすれば選択できますか?Drewや他の人がこの質問に対する回答で指摘したように、オートロードや同様のトリックを使用して制御できます。ただし、最も重要な考慮事項は、使用パターンである必要があります。たまたまviのようなemacsを使用していて、常に開いたり閉じたりしていると、ええと、起動時間が明らかに痛くなる。しかし、一方で、emacsを常に実行している場合、1秒または1分の起動時間は、気になるほど顕著でも重要でもありません。

テスト、実行、またはviのようなemacsを使用している間、バッチモードまたはZileを使用して即座に起動できます。

私の好みは起動時にロードすることですので、エラーはすべて前もってキャッチされます。私は無数のバッファー、モード、およびコンパイル状態がアクティブであり、TRAMPによって管理されているいくつかのリモートの場所にある平日の真っ只中にロードエラーを処理する必要がないことを好みます。このような状況でのオートロードエラーのデバッグは、あまり快適ではありません。


10

含まれているライブラリの多くは、起動時に読み込まれません。

一部のコマンドなどはオートロードされます。つまり、Emacsはそれらを認識し、ロードする方法を知っています。オートロードされるコマンドを使用しようとすると、Emacsは、それがまだロードされていない場合は、それを定義するライブラリーをロードします。

独自のオートロードを作成できます。独自のコマンドまたはライブラリ内のコマンドのいずれについても、自分で作成したものではありません。ElispマニュアルのノードAutoloadを参照してください。


遅延読み込みとして知られていると思いますか?レイジーロードがどのように達成され、それが呼び出されたときにのみロードされる例はありますか?
ReneFroger

あなたが何を求めているのかわからない。はい、遅延読み込みと呼ぶことができます。Elispマニュアルに例と説明があります。;;;###autoloadライブラリのコマンド定義の直前にオートロードクッキー()を追加することは、オートロード定義を与える1つの方法であり、誰かが呼び出したときにライブラリが確実にロードされるようにします。
2015

...手動リンクを読んで、オートロードCookieの処理方法/処理方法を理解してください。パッケージマネージャーは、すべてのELPAパッケージに対してそれらを処理します。それ以外の場合は(autoload...)、initファイルで直接呼び出してそれらを登録します。
phils 2015

あなたの両方の答えをありがとう、それはそれの多くを見つけるのに大いに役立ちました!
ReneFroger

9

他の回答(大多数のライブラリが実際にオンデマンドでのみロードされる方法を説明する)に加えて、実行可能ファイル自体の中に多くのコアelispライブラリを事前にロードするという問題もemacsあります。多くのことが信じられないほど迅速に。

これは、いわゆる「ベア」バージョンのEmacs(実際にコンパイルされたものであり、完全に機能しますが、elispインタープリターとCで書かれた他のコア機能のみが含まれています)を実行し、ロードするように指示することで実現されます。emacsこれらのライブラリが組み込まれた実際のバイナリを最終的に「ダンプ」する前に、事前にロードする必要があるすべてのelispライブラリ。

このメカニズムの詳細は、elispマニュアルに記載されています。
C-hig (elisp) Building Emacs RET

Emacsを自分でコンパイルした場合は、このプロセスを試すことができ、必要に応じて最終的な実行可能ファイルの代替バージョンをダンプすることもできます(一般的にはお勧めしませんが、機能はあります)。

コンパイルされたtemacsバイナリはsrcディレクトリにあり、次のように各バージョンを実行することで、開始時間の違いを比較できます。

$ time ./temacs -l loadup --batch
$ time ./emacs --batch

私のシステムでは、前者は4秒(111個のelispライブラリがロードされている間)かかりますが、後者は〜0.02秒かかります。


この点を説明するための非常に素晴らしい@phils。
Emacsユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.