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.