Como faço para medir o desempenho do meu código elisp? Quais ferramentas / pacotes externos estão disponíveis para eu medir o tempo gasto?
Além do tempo total, posso ver um perfil que mostra o tempo gasto por função? Também posso analisar o uso de memória?
performance
benchmarking
Wilfred Hughes
fonte
fonte
benchmark
e pelo criador de perfil não mede o desempenho do Emacs . Ele mede o desempenho avaliando expressões específicas. É útil na comparação de performances no Emacs. Para medir o desempenho do Emacs, você precisará compará-lo ao desempenho de algo diferente do Emacs. E é aí que a amplitude do Emacs entra em jogo. Você poderia medir o Emacs x XYZ para isso ou aquilo, mas para medir o desempenho do Emacs como um todo, você precisaria de muitas comparações.Respostas:
Referência
As opções mais diretas são o
benchmark
pacote embutido . Seu uso é notavelmente simples:É carregado automaticamente, assim você nem precisa exigir.
Criação de perfil
O benchmark é bom em testes gerais, mas se você estiver com problemas de desempenho, não informará quais funções estão causando o problema. Para isso, você tem o criador de perfil (também interno ) .
M-x profiler-start
.M-x profiler-report
.Você deve ser levado para um buffer com uma árvore navegável de chamadas de função.
fonte
benchmark
A função parece não funcionar: quando eu faço dentro de um.c
arquivo aberto(benchmark 100 (c-font-lock-fontify-region 0 17355))
, continuo recebendovoid-function jit-lock-bounds
.benchmark
existem funçõesbenchmark-run
ebenchmark-run-compiled
. Para mim, a principal diferença era que as duas funções realmente funcionam (veja o comentário anterior) :Além da resposta de @ Malabara, costumo usar uma
with-timer
macro personalizada para instrumentar permanentemente várias partes do meu código (por exemplo, meuinit.el
arquivo).A diferença é que, embora
benchmark
permita estudar o desempenho de um bit específico de código que você instrumenta,with-timer
sempre fornece o tempo gasto em cada parte instrumentada do código (sem muita sobrecarga para partes suficientemente grandes), o que fornece a entrada para você saber qual parte deve ser investigada mais detalhadamente.Exemplo de uso:
produzindo a seguinte saída no
*Messages*
buffer:Devo mencionar que isso é fortemente inspirado pela
use-package-with-elapsed-timer
macro de Jon Wiegley em sua excelenteuse-package
extensão.fonte
emacs-init-time
.esup
e gosto. Mas mais uma vez, o interesse de algo quewith-timer
não é tanto o perfil de algo completamente. O interesse real é que você sempre tenha informações de perfil. Sempre que inicio o emacs, tenho um monte de linhas no meu*Messages*
buffer que me dizem qual parte levou quanto tempo. Se eu detectar algo anormal, posso usar qualquer uma das ferramentas mais adequadas para criar um perfil e otimizar as coisas.emacs-init-time
produz informações interessantes. No entanto, ele fornece apenas um tempo decorrido inclusivo, sem a possibilidade de quebrar partes individuais da inicialização.Além da resposta de @ Malabarba, observe que você pode medir o tempo de execução compilado do seu código com
benchmark-run-compiled
. Essa métrica geralmente é muito mais relevante do que o tempo de execução interpretado queM-x benchmark
fornece:Os três números são o tempo total decorrido, o número de execuções do GC e o tempo gasto no GC.
fonte
O benchmarking não é apenas obter os números, mas também tomar decisões com base na análise de resultados.
Há um pacote benchstat.el no MELPA que você pode usar para obter recursos que o programa benchstat fornece.
Ele implementa benchmarking baseado em comparação, no qual você examina
X
as propriedades de desempenhoY
.As funções do Benchstat podem ser vistas como um
benchmark-run-compiled
invólucro que não apenas coleta as informações, mas as devolve em um formato de interpretação fácil de ler. Inclui:X
eY
Exemplo de uso muito simples:
O
benchstat-compare
renderizará resultados em um buffer temporário:Você precisará do
benchstat
programa binário. Se você usou a linguagem de programação Go, provavelmente já possui uma no seu sistema. Caso contrário, há uma opção de compilá-lo a partir das fontes.O binário pré-compilado para linux / amd64 pode ser encontrado na página de lançamento do github .
fonte