TL; DR Ich habe so viele Pakete, dass meine Startzeit darunter leidet. Wenn Sie nicht glauben, dass dies der Fall sein könnte, lesen Sie weiter.
Meine Emacs-Startzeit ist ziemlich kurz. Ich benutze es nicht use-package
, ich setze einfach autoload
jede Menge Hooks und s, so dass fast der gesamte Code zurückgestellt wird. In Wirklichkeit ist das Ganze in weniger als einer halben Sekunde geladen, obwohl es wie eine verrückte Sauerei aussieht.
Mit der Zeit bemerkte ich jedoch, dass meine Startzeit aus unerklärlichen Gründen geringfügig langsamer wird. Dies hat irgendwann den Punkt erreicht, an dem die Startzeit ≥ 1 Sekunde ist. Ich hatte endlich genug und grub mich in die Wurzel des Problems. Schließlich habe ich meine gesamte ~/.emacs
Datei auskommentiert und festgestellt, dass die Startzeit immer noch ≥ 1 Sekunde war. Tatsächlich hatte es sich nur wenige 0.2
Sekunden rasiert , manchmal sogar weniger. Dann habe ich versucht emacs -q
und festgestellt, dass die Startzeit ~ 0.1
Sekunden war.
Beim Durchsuchen dieses Abschnitts des Elisp-Handbuchs habe ich herausgefunden, warum emacs -q
die Startzeit so stark reduziert wurde. Hält emacs -q
Emacs anscheinend davon ab, beim Start drei Dinge zu tun:
- Laden Sie Ihre Init-Datei
- Laden Sie Ihre
default.el
Datei - Berufung
package-initialize
Wir haben meine Init-Datei bereits ausgeschlossen, da das Auskommentieren meiner gesamten Datei ~/.emacs
fast nichts bewirkt. Ich verwende keine default.el
Datei, daher ist das auch ausgeschlossen. Was package-initialize
als Täter für den Performance-Hit übrig bleibt .
Warum würde package-initialize
so viel Startzeit in Anspruch nehmen? Das war die erste Frage, die ich mir gestellt habe. Lade ich nicht alles automatisch? Nun ja. Aber das ist genau das Problem.
Ich habe diesen Beitrag gefunden, in dem erklärt wird, dass das Aktivieren von Paketen darin besteht, Autoload-Dateien zu lesen und Ladepfade festzulegen. Dies führt offensichtlich zu einer E / A-Beeinträchtigung, wenn Sie viele Pakete haben, da Sie viele Autoload-Dateien lesen und viele Pfade festlegen müssen. Ohne dies fällt die Verwaltung von Autoloads leider in die Hände des Benutzers. Mit anderen Worten, ohne package.el
das Dateisystem nach Autoload-Dateien und -Pfaden durchsuchen zu lassen, müsste ich das selbst verwalten, was ein mühsamer und fehleranfälliger Prozess sein könnte.
Ich würde es vorziehen, diesen Weg nicht zu gehen. Ich habe derzeit 116 Pakete, von denen 107 von ELPA und 25 von Abhängigkeiten sind. Ich bin mir sicher, dass diese unglaubliche Zahl meine Leistung so stark beeinträchtigt. Aber ich bin in einem Dilemma, weil ich keines meiner Pakete entfernen möchte.
Gibt es in einer solchen Situation Abhilfe, um meine Blitzstartzeit wieder herzustellen?
Aktualisieren:
Wir haben einen neuen Thread in der emacs-devel
Mailingliste über einige Patches von Stefan Monnier gestartet (eine Beschreibung dieser Patches finden Sie hier ), um dieses Problem zu lösen. Jeder kann seine Patches testen und Feedback geben.
Ein weiteres Update:
Es scheint, dass Stefan Monnier sich entweder nicht mehr für dieses Thema interessiert oder meine Nachrichten nicht mehr erhält. Ich neige dazu, das erstere zu glauben, was in Ordnung ist, obwohl ich eine Art Antwort von ihm begrüßen würde, wenn dies der Fall ist. Wie auch immer, der Code, den er bisher für diese Ausgabe erstellt hat, funktioniert ganz gut. Die neuesten Patches von ihm finden Sie hier (für Emacs 25.3) und hier (für Emacs master branch).Ich habe dank seiner Patches eine gute Verbesserung meiner Startzeit festgestellt und bin an einem Punkt angelangt, an dem ich mit meiner Startzeit insofern zufrieden bin, als sie so optimiert wie möglich ist, ohne die Funktionen meiner Anpassung zu beeinträchtigen. Ich hatte gehofft, dass diese Patches es irgendwann in die Emacs-Mainline schaffen würden, aber ich denke, dass ich (oder jemand anderes) jetzt die Fackel dafür nehmen müsste, anstatt Stefan. Wir hatten einige Probleme mit der Zuweisung von Urheberrechten und der Lizenzierung auf der Mailingliste. Anfangs war mir das unangenehm, aber aufgrund einiger Kommentare von Richard Stallman und anderen ist die Urheberrechtszuweisung möglicherweise nicht so restriktiv, wie ich ursprünglich dachte. Es kann mir auch möglich sein, meine Werke als Alternative zur Übertragung von Urheberrechten gemeinfrei zu machen.
Auf jeden Fall danke Stefan für die bisherigen Patches! Ich hoffe, Sie werden diese Änderungen weiterentwickeln, aber wenn nicht, ist das in Ordnung und ich werde sie möglicherweise irgendwann weiterentwickeln. Ich danke auch allen anderen, die Einblicke und Beiträge zur Lösung dieses Problems geleistet haben.
Noch ein Update:
Wow, sieht so aus, als wäre dieses Feature endlich gelandet und wird in Emacs 27 sein. Danke an Stefan Monnier!
use-package
ist der richtige Weg dafür.