Que puis-je faire pour accélérer mon démarrage?


41

Quelles sont les choses de base que je pourrais faire pour réduire le temps de démarrage?

Y a-t-il quelque chose en particulier auquel je devrais faire attention, d'ailleurs?

Remarque: le temps de démarrage peut être réduit en démarrant moins souvent Emacs (une fois par session) et en ouvrant des fichiers dans une instance en cours d'exécution . Cette question concerne la réduction du temps de démarrage, pour le démarrage de la session ou tout autre moment où le démarrage d’Emacs est nécessaire.


Voir également la même réponse à Stack Overflow, avec des scores de questions et réponses supérieurs à 50 et à 30 signets "favoris". Les bonnes réponses ici devraient aller au-delà de ce qui est disponible sur Stack Overflow.


1
J'aimerais bien avoir des données à ce sujet, mais je suppose que pour la plupart des utilisateurs, il existe un ou deux packages qui représentent la majeure partie du temps de démarrage. Dans mon cas c'était la barre. Notez que si vous utilisez helm, vous ne pouvez pas vraiment différer son initialisation, vous voulez qu'il soit prêt à être utilisé immédiatement. Je suis passé au lierre, ce qui a ramené mon temps de départ d’environ 12 secondes à moins d’une seconde. J'ai même arrêté d'utiliser la configuration serveur / client. (Au fait, je n'ai pas changé pour réduire le temps de démarrage, c'était simplement un avantage supplémentaire.)
Omar

Réponses:


43

Voici mes points sur la réduction emacs-init-time, cela ne couvre pas des choses comme l'utilisation d'un démon ou du serveur, il va sans dire que vous devriez rarement fermer emacs.

Ne pas:

  • N'exigez pas de paquet dans votre init, si le paquet ne contient pas de cookies de chargement automatique appropriés, assurez-vous de configurer le chargement automatique dans les commandes d'entrée. Donc, si la première fois que vous utilisez package foobar, vous appelez foobar-modeet foobarn'avez pas fourni de pré-chargement automatique, vous aurez besoin de quelque chose comme ceci:

    (autoload 'foobar-mode "foobar")
    

    Cela vous permettra d’appeler foobar-modemême lorsque le foobarpaquet n’a pas encore été chargé. Cette manière foobarne sera pas chargée jusqu'à ce que vous appeliez réellementfoobar-mode

  • Ne pas exécuter package-refresh-contentssi vous n'avez pas besoin d'installer des packages au démarrage. Si vous êtes invité à installer automatiquement les paquets manquants, envisagez de configurer un argument de ligne de commande pour que vous puissiez spécifier quand l'installation automatique doit avoir lieu.

  • Comme ci-dessus, ne faites rien lié au réseau.
  • Ne chargez pas votre desktopinit sauf si vous le désirez vraiment.

Faire

  • Utilisez quelque chose comme use-packagepour gérer vos paquets. Il est ainsi facile de spécifier ce qui doit être demandé, ce qui doit être chargé ultérieurement, ce qui se charge automatiquement et ce qui facilite le profilage de votre init sur une base paquet par paquet.

  • Faites la différence entre charger un thème et l'activer. En bref, vous pouvez en charger autant que vous voulez, mais assurez-vous de ne pas en activer plus d'un. Idéalement, chargez et activez un seul thème. load-themenécessite un argument optionnel pour empêcher l'activation du thème. Il peut être facile d'activer accidentellement plusieurs thèmes, ce qui est lent et moche au démarrage.

  • Trichez: il y a souvent de gros modes globaux que vous voudrez charger dans init, des choses comme undo-tree, autocomplete, ido-mode, etc. Assurez-vous que les fonctions d'entrée ont une configuration de chargement automatique, puis démarrez des minuteries inactives dans votre init pour charger les packages. . Je fais ce testament undo-tree-mode, idoainsi que d’autres , et je ne remarque jamais de retard, car au moment où j’ai vraiment besoin de les utiliser, ils sont déjà chargés.

    Mise à jour: use-package a un peu changé, lisez le fichier readme officiel avant de commencer à utiliser les fonctionnalités de la minuterie.

    Par exemple: si vous voulez retarder légèrement le chargement, global-undo-tree-modevous pouvez mettre ceci dans votre init:

    (run-with-idle-timer 1 nil (lambda () (global-undo-tree-mode t)))
    

    Maintenant, votre init peut continuer joyeusement et global-undo-tree-modene sera activé que lorsque tout le reste sera prêt et que vous serez au volant.

    use-packageprend en charge ce type de comportement en utilisant le mot clé: idle. Voici la undo-treeconfig de mon .init.el:

    (use-package undo-tree
      :idle (global-undo-tree-mode 1)
      :bind (("C-c j" . undo-tree-undo)
             ("C-c k" . undo-tree-redo)
             ("C-c l" . undo-tree-switch-branch)
             ("C-c ;" . undo-tree-visualize))
      :ensure t)
    
  • Profil de votre init, il est toujours surprenant de voir où les vrais ralentissements sont. profile-dotemacs.el est un outil incroyable que j'ai utilisé pour m'aider à faire passer mon init d'environ 6 secondes à <1 seconde.

Un use-packageinit bien configuré peut être incroyablement rapide. Je ne compile pas en octets mon init et il utilise use-packagepour configurer 95 paquets et démarre en <1 seconde.


7
"Faites le profil de votre init, il est toujours surprenant de voir où sont les vrais ralentissements." Alerte spoiler, c'est cette (require 'org)ligne. :-)
Malabarba

@ Jordan, pourriez-vous nous expliquer un peu plus comment vous vous assurez que les fonctions d'entrée ont une configuration de chargement automatique, puis démarrez des minuteries inactives dans votre init pour charger les paquetages, en particulier pour le mode d'arborescence d'annulation? Merci.
Francisco Dibar

@FranciscoDibar J'ai mis à jour mon message avec des exemples.
Jordon Biondo

2
J'utilise immédiatement le mode ido, Cx Cf ou Mx pour smex est la première chose à faire presque toujours lorsque j'ouvre emacs, et je n'ai jamais remarqué de problème. Aussi, si vous voulez annuler quelque chose en moins d'une seconde après avoir ouvert emacs ... Eh bien, je n'ai rien à dire à ce sujet. Si cela vous préoccupe vraiment, essayez-le vous-même ou utilisez simplement une minuterie non inactive ou après le raccordement de l'initialisation.
Jordon Biondo

1
La suggestion de minuterie d'inactivité est utile. Une syntaxe de chargement légèrement plus courte est (run-with-idle-timer 1 nil #'global-undo-tree-mode)'. If the function you are loading takes parameters you can just provide them after the la commande # '`.
Andrew Swann

8

Quelque chose qui est apparu récemment sur emacs reddit : réduisez le nombre d’appels de garbage collection en plaçant ceci près du début de votre fichier init:

(setq gc-cons-threshold 50000000)

(add-hook 'emacs-startup-hook 'my/set-gc-threshold)
(defun my/set-gc-threshold ()
  "Reset `gc-cons-threshold' to its default value."
  (setq gc-cons-threshold 800000))

Dans l'exemple ci-dessus, le GC est appelé tous les 50 Mo (au lieu de 800 Ko par défaut), ce qui semble judicieux sur un système moderne disposant de beaucoup de RAM.


1
Sauf que la valeur est (a) probablement bien supérieure à ce dont vous avez besoin (je ne vois aucune différence avec un dixième de celle-ci); et (b) évidemment pas une valeur que vous souhaitez conserver au-delà du démarrage, car un seuil GC élevé impose des délais plus longs en cas de CG. Si vous le fixez haut pour init, réglez-le plus bas après init. Je pense que emacs-startup-hookc'est un bon endroit pour faire ça.
phils

1
@phils Merci! (a) Sur ma configuration, 50 Mo indique le nombre minimal de CPG (et le temps de démarrage minimal). Si je vais aussi bas que 10 Mo, la différence est perceptible / mesurable (même si cela ne change pas grand chose dans la pratique ...) (b) bonne idée, merci. J'ai édité le post pour refléter votre commentaire.
ffevotte

6

Le temps que vous passerez à optimiser votre temps de démarrage sera probablement supérieur à tout le temps supplémentaire que vous auriez autrement attendu au démarrage d'Emacs.

Pour le moment, je passe 25 requireappels dans mon fichier init afin que Flycheck puisse détecter les erreurs d’orthographe dans mon code. Mon temps de démarrage est ...

$ time emacs --eval '(save-buffers-kill-terminal)'

real    0m2.776s
user    0m2.305s
sys     0m0.148s

En outre, sur mon système, time emacs -Q --eval '(save-buffers-kill-terminal)'a un realde 0m0.404s. Le temps maximum théorique que je peux économiser est de 2,3 secondes.

Disons que je passe une heure à faire toute l’optimisation de mon fichier init. (Je ne compterai pas les 15 à 30 minutes additionnelles passées à une date ultérieure pour essayer de comprendre pourquoi mes modifications ne prenaient pas effet en raison de la compilation de mon fichier init par octets.) (Je ne compterai pas non plus le temps écoulé. Flycheck m'aurait sauvé dans le débogueur si je n'avais pas supprimé les requireappels.) Il y a 3600 secondes dans une heure, donc si j'arrivais à économiser les 2,3 secondes, mon investissement en temps ne porterait ses fruits qu'après 1565 démarrages.

En supposant que je redémarre Emacs 3 fois par jour, il faudrait un an et demi avant que cet investissement porte ses fruits. Si je laissais la même instance Emacs fonctionner pendant des jours (comme je le fais souvent), je ne redémarrerais probablement que 2 à 5 fois par semaine, auquel cas il faudrait 6 à 15 ans pour que cet investissement soit rentable.

Je suis généreux, car vous passerez probablement plus d'une heure à optimiser votre démarrage et vous ne économiserez probablement pas le nombre maximum de secondes théoriques.


12
Mais vous serez potentiellement plus heureux.
phils

2
Cela peut être vrai pour une personne, mais l’intérêt de StackExchange est de partager. Qu'en est-il d'une astuce qui prend 30 minutes pour une personne à trouver, mais réduit de 1 seconde le temps de démarrage de dizaines de personnes? Diriez-vous toujours que c'est un mauvais investissement?
ffevotte

@phils Ironiquement, j'ai envisagé de dire la même chose, mais pour appuyer mon propre point de vue! "Avant de gémir au sujet de votre temps de démarrage, pensez-vous: je suis heureux de ne pas avoir perdu de temps à optimiser cela!" "
Jackson

@ Francesco Et cet article est mon astuce qui fait gagner du temps à des dizaines de personnes.
Jackson

@Jackson Je ne suis toujours pas d'accord avec vous sur cette question particulière, mais au moins, maintenant, je vois ce que vous voulez dire. Merci :)
ffevotte
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.