¿Cómo mido el rendimiento de mi código elisp? ¿Qué herramientas / paquetes externos están disponibles para mí para medir el tiempo necesario?
Además del tiempo total, ¿puedo ver un perfil que muestre el tiempo empleado por función? ¿Puedo perfilar el uso de memoria también?
performance
benchmarking
Wilfred Hughes
fuente
fuente
benchmark
y el generador de perfiles no mide el rendimiento de Emacs . Mide el rendimiento evaluando expresiones particulares. Es útil para comparar actuaciones dentro de Emacs. Para medir el rendimiento de Emacs en sí mismo, deberá compararlo con el rendimiento de algo distinto de Emacs. Y ahí es donde entra en juego la amplitud de Emacs. Podría medir Emacs vs XYZ para esto o aquello, pero para medir el rendimiento de Emacs en su conjunto necesitaría innumerables comparaciones de este tipo.Respuestas:
Punto de referencia
La opción más sencilla es el
benchmark
paquete integrado . Su uso es notablemente simple:Está autocargado, por lo que ni siquiera necesita requerirlo.
Perfilado
El punto de referencia es bueno en las pruebas generales, pero si tiene problemas de rendimiento, no le indica qué funciones están causando el problema. Para eso, tiene el perfilador (también incorporado) .
M-x profiler-start
.M-x profiler-report
.Debería ser llevado a un búfer con un árbol de llamadas de función navegable.
fuente
benchmark
La función no parece funcionar: cuando lo hago dentro de un.c
archivo abierto(benchmark 100 (c-font-lock-fontify-region 0 17355))
, sigo obteniendovoid-function jit-lock-bounds
.benchmark
hay funcionesbenchmark-run
ybenchmark-run-compiled
. Para mí, la principal diferencia era que ambas funciones realmente funcionan (vea el comentario anterior) : ЬAdemás de la respuesta de @ Malabara, tiendo a usar una
with-timer
macro personalizada para instrumentar permanentemente varias partes de mi código (por ejemplo, miinit.el
archivo).La diferencia es que, si bien
benchmark
permite estudiar el rendimiento de un bit de código específico que usted instrumenta,with-timer
siempre le brinda el tiempo que pasa en cada parte instrumentada del código (sin demasiada sobrecarga para partes suficientemente grandes), lo que le brinda la entrada para saber qué parte debe investigarse más a fondo.Ejemplo de uso:
produciendo el siguiente resultado en el
*Messages*
búfer:Debo mencionar que esto está fuertemente inspirado por la
use-package-with-elapsed-timer
macro de Jon Wiegley en su excelenteuse-package
extensión.fuente
emacs-init-time
.esup
y me gusta. Pero una vez más, el interés de algowith-timer
así no es tanto perfilar algo minuciosamente. El verdadero interés es que siempre tenga información de perfil. Cada vez que inicio emacs, tengo una línea de líneas en mi*Messages*
búfer que me dice qué parte tomó cuánto tiempo. Si detecto algo anormal, puedo usar cualquiera de las herramientas más adecuadas para perfilar y optimizar las cosas.emacs-init-time
produce información interesante. Sin embargo, solo proporciona un tiempo transcurrido inclusivo, sin la posibilidad de desglosar partes individuales de la inicialización.Además de la respuesta de @ Malabarba, tenga en cuenta que puede medir el tiempo de ejecución compilado de su código con
benchmark-run-compiled
. Esa métrica a menudo es mucho más relevante que el tiempo de ejecución interpretado queM-x benchmark
le brinda:Los tres números son el tiempo total transcurrido, el número de ejecuciones de GC y el tiempo pasado en GC.
fuente
La evaluación comparativa no se trata solo de obtener los números, sino también de tomar decisiones basadas en el análisis de resultados.
Hay un paquete benchstat.el en MELPA que puede usar para obtener funciones que proporciona el programa benchstat .
Implementa una evaluación comparativa basada en la comparación en la que examina
X
las propiedades de rendimientoY
.Las funciones de Benchstat se pueden ver como un
benchmark-run-compiled
contenedor que no solo recopila la información, sino que la devuelve en un formato de interpretación fácil de leer. Incluye:X
yY
Ejemplo de uso muy simple:
El
benchstat-compare
renderizará resultados en un buffer temporal:Sin
benchstat
embargo, necesitará un programa binario. Si utilizó el lenguaje de programación Go, lo más probable es que ya tenga uno en su sistema. De lo contrario, existe la opción de compilarlo desde las fuentes.El binario precompilado para linux / amd64 se puede encontrar en la página de lanzamiento de github .
fuente