44 votes

Conseils pour le profilage de virer Emacs Lisp?

- Je personnaliser Emacs beaucoup. Récemment, j'ai ajouté quelque chose à mon .emacs configuration que de façon sporadique des chevilles de mon CPU à 100%, mais je ne sais vraiment pas ce que c'est.

Si j'appuie sur C-g un tas de fois, je serai éventuellement obtenir un message ci-dessous le minibuffer me demandant si je veux auto-enregistrer mes fichiers et ensuite, si je veux abandonner emacs entièrement. Si je continue à dire non et appuyez sur C-g, finalement, j'ai peut retourner à l'exécution emacs comme d'habitude. Une heure plus tard, il se produira de nouveau.

Je pourrais continuer comme je suis, en commentant les diverses choses que j'ai ajouté récemment, le redémarrage de emacs, qui cherchent à réduire le coupable, mais c'est lent va.

Est-il possible que je peux le profil de emacs directement à la figure ce que lisp fonction est monopolisant le CPU?

51voto

Gareth Rees Points 31350

La suggestion de réglage debug-on-quit de t , de sorte que vous pouvez trouver ce que Emacs est à est un bon. Vous pouvez considérer cela comme étant une forme d'échantillonnage de profilage avec un seul échantillon: souvent, un seul échantillon est tout ce dont vous avez besoin.


Mise à jour: à Partir de la version 24.3, Emacs contient deux profileurs. Il y a un (nouveau) l'échantillonnage profiler en profiler.el, et une (ancienne) instrumentant profiler en elp.el.

Le profileur d'échantillonnage est documentée ici. C'est assez simple à utiliser:

De profil, tapez M-x profiler-start. Vous pouvez choisir de profil par l'utilisation du processeur, utilisation de la mémoire, ou les deux. Après avoir fait quelques travaux, tapez M-x profiler-report pour afficher un résumé de la mémoire tampon pour chaque ressource que vous avez choisi pour le profil. Lorsque vous avez terminé de profilage, tapez M-x profiler-stop.

Voici un exemple de sortie à partir d'un cpu+mem profiler session avec le Perforce/Emacs intégration que je maintiens. J'ai élargi le supérieur de la fonction (progn) afin de savoir où le temps de calcul et l'utilisation de la mémoire est à venir à partir de.

Function                                            Bytes    %
- progn                                        26,715,850  29%
  - let                                        26,715,850  29%
    - while                                    26,715,850  29%
      - let                                    26,715,850  29%
        - cond                                 26,715,850  29%
          - insert                             26,715,850  29%
            + c-after-change                   26,713,770  29%
            + p4-file-revision-annotate-links       2,080   0%
+ let                                          20,431,797  22%
+ call-interactively                           12,767,261  14%
+ save-current-buffer                          10,005,836  11%
+ while                                         8,337,166   9%
+ p4-annotate-internal                          5,964,974   6%
+ p4-annotate                                   2,821,034   3%
+ let*                                          2,089,810   2%

Vous pouvez voir que le coupable est - c-after-change, de sorte qu'il semble comme si je pouvais économiser beaucoup de temps CPU et de la mémoire par localement contraignant inhibit-modification-hooks de t autour de ce code.


Vous pouvez également utiliser Emacs Lisp Profiler. C'est plutôt sous-documentées: vous aurez à lire les commentaires en elp.el , pour les détails, mais, fondamentalement, vous exécutez elp-instrument-package pour activer le profilage pour toutes les fonctions avec un préfixe, puis elp-results pour voir les résultats.

Voici quelques exemples de sortie après avoir tapé M-x elp-instrument-package RET c- RET, fontifying de 4 000 lignes de C, puis en exécutant elp-results (et à l'aide de elp-sort-by-function de trier par nombre d'appels):

Function Name                  Call Count  Elapsed Time  Average Time
=============================  ==========  ============  ============
c-skip-comments-and-strings    107         0.0           0.0
c-valid-offset                 78          0.0           0.0
c-set-offset                   68          0.031         0.0004558823
c-end-of-macro                 52          0.0           0.0
c-neutralize-CPP-line          52          0.0           0.0
c-font-lock-invalid-string     20          0.0           0.0
c-set-style-1                  19          0.031         0.0016315789
...

Dans votre cas particulier, le profileur n'aide pas immédiatement, parce que vous ne savez pas quelle formule est en faute. Mais si vous pouvez faire une supposition (ou utilisez debug-on-quit de le trouver pour vous en assurer), puis le profileur peut vous aider à diagnostiquer le problème en détail.

8voto

luapyad Points 2680

Avez-vous essayé: Options->Enter debugger on Quit/C-g? (c'est sur emacs22)

Si vous avez besoin de déboguer le démarrage d'emacs: utiliser emacs -q --no-site-file, visitez votre .emacs (ou site-start.el ou quoi que ce soit), activer l'option de menu Options->Enter debugger on Quit/C-g, puis l'élément de menu Emacs-Lisp->Evaluate buffer et C-g lorsqu'il apparaît à geler. Il y a peut être un moyen plus facile de le faire.........

6voto

iiska Points 181

Avec la dope.el vous pouvez le profil entier .emacs ou plusieurs elisp les fichiers chargés au démarrage. Télécharger à partir de www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/

M-x dope-quick-start montrera une petite introduction tutoriel.

Edit: L'URL d'origine est aujourd'hui disparue, mais il ya un travail de miroir sur Git Hub:
https://raw.github.com/emacsmirror/dope/master/dope.el

5voto

Nietzche-jou Points 7711

Ce n'est pas, à proprement parler, une réponse à votre question, mais plutôt que de faire le commentaire-out-et-redémarrer chose, vous pouvez commencer à emacs avec l' -q option, chargez votre .emacs dans une mémoire tampon et d'évaluer chaque sexpr-vous avec C-x C-e pour traquer la délinquance de un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X