TL; DR J'ai une telle quantité de paquets que ça me fait mal au démarrage. Si vous ne pensez pas que cela pourrait être le cas, lisez la suite.
Mon temps de démarrage Emacs est assez petit. Je ne l'utilise pas use-package
, je mets juste des tonnes de hooks et autoload
s pour que presque tout le code soit différé. En réalité, le tout est chargé en généralement moins d'une demi-seconde, même si cela semble être un gâchis fou.
Cependant, au fil du temps, j'ai remarqué que mon temps de démarrage était extrêmement lent, inexplicablement. Ceci est finalement arrivé au point où le temps de démarrage est ≥ 1 seconde. J'en ai finalement eu assez et j'ai creusé à la racine du problème. J'ai finalement commenté tout mon ~/.emacs
fichier et constaté que le temps de démarrage était toujours ≥ 1 seconde. En fait, il ne s'était rasé qu'environ 0.2
quelques secondes, parfois même moins. Ensuite, j'ai essayé emacs -q
et constaté que le temps de démarrage était de ~ 0.1
secondes.
En examinant cette section du manuel Elisp, j'ai découvert pourquoi emacs -q
le temps de démarrage était tellement réduit. Apparemment emacs -q
, Emacs empêche trois choses au démarrage:
- chargement de votre fichier init
- chargement de votre
default.el
fichier - appel
package-initialize
Nous avons déjà exclu mon fichier init, car commenter mon tout ~/.emacs
ne fait presque rien. Je n'utilise pas de default.el
fichier, ce qui est également exclu. Ce qui laisse package-initialize
le coupable du succès de la performance.
Pourquoi prendrait package-initialize
autant de temps de démarrage? C'était la première question que je me posais. Ne suis-je pas en train de tout charger automatiquement? Hé bien oui. Mais c'est précisément le problème.
J'ai trouvé ce post qui explique que "l'activation" des packages consiste à lire des fichiers de chargement automatique et à définir des chemins de chargement. Cela entraîne évidemment une pénalité d'E / S lorsque vous avez plusieurs packages car vous avez de nombreux fichiers à chargement automatique à lire et de nombreux chemins à définir. Malheureusement, sans cela, la tâche de gérer les chargements automatiques incombe à l'utilisateur. En d'autres termes, sans laisser package.el
explorer le système de fichiers pour les fichiers et les chemins de chargement automatique, je devrais gérer moi-même ce qui pourrait être un processus fastidieux et sujet aux erreurs.
Je préférerais ne pas emprunter cette voie. J'ai actuellement 116 packages, dont 107 d'ELPA et 25 de dépendances. Je suis sûr que ce nombre énorme est ce qui dégrade si gravement mes performances. Mais je suis dans un dilemme car je ne veux supprimer aucun de mes packages.
Existe-t-il un remède dans une telle situation pour récupérer mon temps de démarrage de la foudre?
Mise à jour:
Nous avons commencé un nouveau fil sur la emacs-devel
liste de diffusion sur certains correctifs par Stefan Monnier (une description de ces correctifs est ici ) pour résoudre ce problème. Tout le monde est invité à tester ses correctifs et à donner son avis.
Une autre mise à jour:
Il semble que Stefan Monnier ne soit plus intéressé par ce problème ou qu'il ne reçoive pas mes messages. Je suis enclin à croire le premier, ce qui est bien, mais j'apprécierais une sorte de réponse de sa part si tel est le cas. Quoi qu'il en soit, le code qu'il a produit jusqu'à présent pour ce numéro fonctionne assez bien. Les patchs les plus récents sont disponibles ici (pour Emacs 25.3) et ici (pour Emacs master branch).J'ai vu de bonnes améliorations sur mon temps de démarrage grâce à ses correctifs et je suis à un point où je suis à l'aise avec mon temps de démarrage dans la mesure où il est aussi optimisé que possible sans couper les fonctionnalités de ma personnalisation. J'espérais que ces correctifs arriveraient dans la ligne principale d'Emacs à un moment donné, mais je suppose que moi (ou quelqu'un d'autre) devrais reprendre le flambeau maintenant, au lieu de Stefan. Nous avions un peu de spar sur la liste de diffusion sur l'attribution des droits d'auteur et les licences. J'étais initialement mal à l'aise de le faire, mais en raison de certains commentaires de Richard Stallman et d'autres, la cession des droits d'auteur peut ne pas être aussi restrictive que je le pensais à l'origine. De plus, il peut être possible pour moi de placer mes œuvres dans le domaine public comme alternative à la cession du droit d'auteur.
En tout cas, merci Stefan pour les patchs à ce jour! J'espère que vous continuerez à développer ces changements, mais sinon, ça va et je pourrai continuer à les développer à un moment donné. Je remercie également toutes les autres personnes qui ont offert leur avis et leur contribution à la résolution de ce problème.
Encore une autre mise à jour:
Wow, on dirait que cette fonctionnalité a finalement atterri et sera dans Emacs 27. Merci à Stefan Monnier!
use-package
est la voie à suivre pour cela.