Wie schafft es Emacs, mit vielen el-Dateien sofort zu starten?

11

Wie jeder Emacs'er wissen wird, leide ich derzeit unter meiner umfangreichen Dot-Emacs-Konfiguration. Alle meine Pakete befinden sich in den Containern von use-package, und ich habe alle meine .el-Dateien bytekompiliert. Trotzdem startet Emacs in 6,4 Sekunden und lädt anschließend den Rest der Pakete (etwa 40 davon).

Ich dachte über andere Wege nach, um die lange Startzeit zu lösen, dann bemerkte ich etwas. Der Standard-Emacs (ohne Benutzerkonfiguration) verwendet viele .elBibliotheken, die in jedem Emacs enthalten sind. Sie befinden sich in \shares\emacs\version number\lisp\.

Selbst mit vielen Lisp-Dateien kann es in einer Sekunde gestartet werden. Als ich die Dateien vieler Pakete inspizierte, die in den Standard-Emacs enthalten sind, fand ich nichts Außergewöhnliches, das erklären könnte, warum Emacs innerhalb einer Sekunde gestartet werden kann. Kann mir jemand sagen, wie Emacs das schafft, selbst mit Tausenden von .elDateien?

ReneFroger
quelle
1
Verwenden Sie :defer tin Ihren use-packageErklärungen, wo immer dies möglich ist?
Mondhorn
7
Zahlreiche Kernbibliotheken in Emacs sind in der ausführbaren Datei über den beim Erstellen von Emacs verwendeten Dump- Mechanismus vorinstalliert , was auch die Illusion vermittelt, dass viele Dinge unglaublich schnell geladen werden . Sehen Sie, ob Sie daran interessiert sind, etwas darüber zu erfahren. C-h i g (elisp) Building Emacs
Phils
2
@phils: Es wäre großartig, wenn Sie Ihren Kommentar zu einer Antwort erweitern könnten. Es scheint, dass der Dump-Mechanismus bei Emacs-SE noch gar nicht erwähnt wird.
Paprika
und meins ist
76s
Paprika: Fertig ..
Phils

Antworten:

9

Kann mir jemand sagen, wie Emacs das schafft, selbst mit Tausenden von .el-Dateien?

Emacs "verwaltet" dies, indem es beim Start nicht geladen wird, wodurch das Laden der Kernanwendung nicht aufgehalten wird. Dies wiederum als Folge einer schnelleren Rückgabe der Tastatursteuerung an den Benutzer.

Aber wann wird es geladen? Bei der ersten Verwendung dieser Funktion, dieses Modus oder dieser Funktion.

Verlangsamt es nicht? Ja, beim ersten Gebrauch. Das ist der Kompromiss. Möchten Sie beim Start von emacs oder beim ersten Gebrauch langsamer fahren?

Ist es auffällig? Das Laden zum Startzeitpunkt scheint länger zu dauern, da auch andere Kernbibliotheken geladen werden. Beim ersten Gebrauch fühlt es sich jedoch schneller an, da nur diese Teilmengenfunktion geladen wird.

Warum sollte dann jemand beim Start die Last auswählen? Da es einigen nichts ausmacht, beim Start darauf zu warten, alle häufig verwendeten Bibliotheken zu laden, werden alle Vorgänge nach dem Laden schnell ausgeführt.

Wie kann ich wählen? Wie Drew und andere in ihren Antworten auf genau diese Frage hervorgehoben haben, können Sie Autoload und ähnliche Tricks zur Steuerung verwenden. Die wichtigste Überlegung sollte jedoch Ihr Nutzungsmuster sein. Wenn Sie Emacs wie vi verwenden, die sich ständig öffnen und schließen, wird die Startzeit schmerzhaft offensichtlich. Wenn Sie jedoch Emacs verwenden, die ständig ausgeführt werden, ist eine Startzeit von 1 Sekunde oder 1 Minute nicht so auffällig oder wichtig genug, um sich darum zu kümmern.

Beachten Sie, dass Sie den Batch-Modus oder Zile für den sofortigen Start verwenden können, während Sie Emacs wie vi testen, ausführen oder auf andere Weise verwenden.

Ich bevorzuge es, beim Start zu laden, damit Fehler im Voraus erkannt werden. Ich bevorzuge es, mich während eines Arbeitstages nicht mit Ladefehlern befassen zu müssen, wenn unzählige Puffer, Modi und Kompilierungszustände zusammen mit mehreren von TRAMP verwalteten Remote-Standorten aktiv sind. Das Debuggen von Autoload-Fehlern unter solchen Bedingungen ist nicht sehr angenehm.

Emacs Benutzer
quelle
10

Viele der enthaltenen Bibliotheken werden beim Start nicht geladen.

Einige Befehle usw. werden automatisch geladen , was bedeutet, dass Emacs sie erkennt und weiß, wie sie geladen werden. Wenn Sie versuchen, einen Befehl zu verwenden, der automatisch geladen wird, lädt Emacs die Bibliothek, die ihn definiert, falls er noch nicht geladen wurde.

Sie können Ihre eigenen Autoloads erstellen, unabhängig davon, ob Sie eigene Befehle oder Befehle in Bibliotheken haben, die Sie nicht geschrieben haben. Siehe das Elisp-Handbuch, Knoten Autoload .

Drew
quelle
Wie bekannt als Lazy-Loading, nehme ich an? Gibt es ein Beispiel dafür, wie ein verzögertes Laden erreicht wird, das nur geladen wird, wenn es aufgerufen wird?
ReneFroger
Nicht sicher, was Sie fragen. Ja, man könnte es faul laden nennen. Beispiele und Erklärungen finden Sie im Elisp-Handbuch. Das Hinzufügen eines Autoload-Cookies ( ;;;###autoload) unmittelbar vor einer Befehlsdefinition in Ihrer Bibliothek ist eine Möglichkeit, eine Autoload-Definition zu erstellen, um sicherzustellen, dass die Bibliothek geladen wird, wenn jemand sie aufruft.
Drew
... aber lesen Sie diesen manuellen Link, um zu verstehen, wie / ob diese Autoload-Cookies verarbeitet werden. Der Paketmanager behandelt sie für alle ELPA-Pakete. Andernfalls würden Sie (autoload...)direkt in Ihrer Init-Datei aufrufen , um sie zu registrieren.
Phils
Vielen Dank für Ihre beiden Antworten. Es hat sehr geholfen, mehr darüber herauszufinden!
ReneFroger
9

Zusätzlich zu den anderen Antworten (die erklären , wie die Mehrheit der Bibliotheken sind eigentlich nur bei Bedarf geladen), gibt es auch die Frage der Vorbelastung von vielen Kern elisp Bibliotheken innerhalb der emacsausführbaren Datei selbst, die eine Illusion von ihm einen Laden bietet viele Dinge unglaublich schnell.

Dies wird erreicht , indem Sie eine sogenannte „nackte“ Version von Emacs (das ist das, was tatsächlich kompiliert wurde, und das ist voll funktionsfähig, enthält aber nur die elisp Interpreter und andere Kernfunktionen in C geschrieben), und zu sagen , dass zu Last Alle Elisp-Bibliotheken, die vorinstalliert werden sollten, bevor die eigentliche emacsBinärdatei mit den eingebauten Bibliotheken endgültig "ausgegeben" wird .

Dieser Mechanismus ist im elisp-Handbuch beschrieben:
C-hig (elisp) Building Emacs RET

Wenn Sie Emacs selbst kompiliert haben, können Sie mit diesem Prozess experimentieren und auf Wunsch sogar alternative Versionen der endgültigen ausführbaren Datei sichern (nicht allgemein empfohlen, aber die Funktion ist vorhanden).

Die kompilierte temacsBinärdatei befindet sich im srcVerzeichnis, und Sie können den Unterschied in den Startzeiten vergleichen, indem Sie jede Version wie folgt ausführen:

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

Auf meinem System dauert Ersteres ~ 4 Sekunden (währenddessen 111 Elisp-Bibliotheken geladen werden), während Letzteres ~ 0,02 Sekunden dauert.

Phils
quelle
Sehr schöne @phils für diesen Punkt.
Emacs User