Comment mesurer les performances de mon code elisp? Quels outils / packages externes sont disponibles pour mesurer le temps nécessaire?
En plus du temps total, puis-je voir un profil qui montre le temps pris par fonction? Puis-je également profiler l'utilisation de la mémoire?
performance
benchmarking
Wilfred Hughes
la source
la source
benchmark
et le profileur ne mesure pas les performances d' Emacs . Il mesure les performances évaluant des expressions particulières. Il est utile pour comparer les performances dans Emacs. Pour mesurer les performances d'Emacs lui-même, vous devez le comparer aux performances de quelque chose d'autre qu'Emacs. Et c'est là que l'étendue d'Emacs entre en jeu. Vous pouvez mesurer Emacs par rapport à XYZ pour ceci ou cela, mais pour mesurer les performances d'Emacs dans son ensemble, vous aurez besoin d'une multitude de telles comparaisons.Réponses:
Référence
Les options les plus simples sont le
benchmark
package intégré. Son utilisation est remarquablement simple:Il est chargé automatiquement, vous n'avez donc même pas besoin de l'exiger.
Profilage
La référence est bonne pour les tests globaux, mais si vous rencontrez des problèmes de performances, elle ne vous indique pas quelles fonctions sont à l'origine du problème. Pour cela, vous avez le profileur (également intégré) .
M-x profiler-start
.M-x profiler-report
.Vous devez être redirigé vers un tampon avec une arborescence navigable d'appels de fonction.
la source
benchmark
la fonction ne semble pas fonctionner: quand je fais à l'intérieur d'un.c
fichier ouvert(benchmark 100 (c-font-lock-fontify-region 0 17355))
, je continue à obtenirvoid-function jit-lock-bounds
.benchmark
il existe des fonctionsbenchmark-run
etbenchmark-run-compiled
. Pour moi, la principale différence était que les deux fonctions fonctionnent réellement (voir le commentaire précédent ) : ЬEn plus de la réponse de @ Malabara, j'ai tendance à utiliser une
with-timer
macro sur mesure pour instrumenter en permanence diverses parties de mon code (par exemple moninit.el
fichier).La différence est que, tout en
benchmark
permettant d'étudier les performances d'un bit de code spécifique que vous instrumentez,with-timer
vous donne toujours le temps passé dans chaque partie instrumentée du code (sans trop de surcharge pour des parties suffisamment grandes), ce qui vous donne la possibilité de connaître quelle partie devrait être étudiée plus avant.Exemple d'utilisation:
donnant la sortie suivante dans le
*Messages*
tampon:Je dois mentionner que cela est fortement inspiré par la
use-package-with-elapsed-timer
macro de Jon Wiegley dans son excellenteuse-package
extension.la source
emacs-init-time
.esup
et j'aime ça. Mais encore une fois, l'intérêt d'une telle chosewith-timer
n'est pas tant de profiler quelque chose à fond. Le véritable intérêt est que vous disposez toujours d'informations de profilage. Chaque fois que je démarre emacs, j'ai un tas de lignes dans mon*Messages*
tampon qui me disent quelle partie a pris combien de temps. Si je détecte quelque chose d'anormal, je peux alors utiliser l'un des outils les plus adéquats pour profiler et optimiser les choses.emacs-init-time
produit des informations intéressantes. Cependant, il ne donne qu'un temps écoulé inclusif, sans possibilité de décomposer des parties individuelles de l'initialisation.En plus de la réponse de @ Malabarba, notez que vous pouvez mesurer le temps d'exécution compilé de votre code avec
benchmark-run-compiled
. Cette métrique est souvent beaucoup plus pertinente que le temps d'exécution interprété quiM-x benchmark
vous donne:Les trois nombres sont le temps total écoulé, le nombre d'exécutions de GC et le temps passé en GC.
la source
L'analyse comparative ne consiste pas seulement à obtenir les chiffres, mais aussi à prendre des décisions basées sur l'analyse des résultats.
Il existe un package benchstat.el sur MELPA que vous pouvez utiliser pour obtenir les fonctionnalités fournies par le programme benchstat .
Il implémente une analyse comparative basée sur la comparaison dans laquelle vous examinez
X
les propriétés de performanceY
.Les fonctions Benchstat peuvent être vues comme un
benchmark-run-compiled
wrapper qui non seulement recueille les informations, mais les restitue dans un format d'interprétation facile à lire. Il comprend:X
etY
Exemple d'utilisation très simple:
Le
benchstat-compare
rendra les résultats dans un tampon temporaire:Vous aurez cependant besoin d'un
benchstat
programme binaire. Si vous avez utilisé le langage de programmation Go, vous en avez probablement déjà un dans votre système. Sinon, il est possible de le compiler à partir des sources.Le binaire précompilé pour linux / amd64 peut être trouvé sur la page de publication de github .
la source