Jak zmierzyć wydajność mojego kodu elisp? Jakie narzędzia / pakiety zewnętrzne są dostępne do pomiaru czasu?
Czy oprócz całkowitego czasu mogę zobaczyć profil pokazujący czas poświęcony na funkcję? Czy mogę również profilować użycie pamięci?
performance
benchmarking
Wilfred Hughes
źródło
źródło
benchmark
i profiler, nie mierzy wydajności Emacsa . Mierzy wydajność oceniając poszczególne wyrażenia. Jest to pomocne w porównywaniu wydajności w Emacsie. Aby zmierzyć wydajność samego Emacsa, musisz porównać go z wydajnością czegoś innego niż Emacs. I tu właśnie zaczyna się gra Emacsa. Możesz zmierzyć Emacsa względem XYZ dla tego lub tamtego, ale aby zmierzyć wydajność Emacsa jako całości, potrzebujesz kilku takich porównań.Odpowiedzi:
Reper
Najprostszą opcją jest wbudowany
benchmark
pakiet. Jego użycie jest niezwykle proste:Jest ładowany automatycznie, więc nie musisz go nawet wymagać.
Profilowy
Benchmark jest dobry w ogólnych testach, ale jeśli masz problemy z wydajnością, nie mówi ci, które funkcje powodują problem. Do tego masz (również wbudowany) profiler .
M-x profiler-start
.M-x profiler-report
.Powinieneś zostać przeniesiony do bufora z nawigowalnym drzewem wywołań funkcji.
źródło
benchmark
funkcja nie działa: kiedy robię wewnątrz otwartego.c
pliku(benchmark 100 (c-font-lock-fontify-region 0 17355))
, ciągle się pojawiavoid-function jit-lock-bounds
.benchmark
istnieją funkcjebenchmark-run
ibenchmark-run-compiled
. Dla mnie główna różnica polegała na tym, że obie funkcje faktycznie działają (patrz poprzedni komentarz) : ЬOprócz odpowiedzi @ Malabara, mam tendencję do używania niestandardowego
with-timer
makra, aby trwale instrumentować różne części mojego kodu (np. Mójinit.el
plik).Różnica polega na tym, że chociaż
benchmark
pozwala badać wydajność określonego fragmentu kodu, który instrumentujesz,with-timer
zawsze daje ci czas spędzony w każdej instrumentowanej części kodu (bez dużego obciążenia dla wystarczająco dużych części), co daje wkład do poznania która część powinna być dalej badana.Przykładowe zastosowanie:
uzyskując następujące dane wyjściowe w
*Messages*
buforze:Powinienem wspomnieć, że jest to w dużej mierze inspirowane makrem Jona Wiegleya
use-package-with-elapsed-timer
w jego doskonałymuse-package
rozszerzeniu.źródło
emacs-init-time
.esup
i lubię to. Ale po raz kolejny interesuje się czymś takim, jakwith-timer
nie tyle dokładnym profilowaniem czegoś. Prawdziwe zainteresowanie polega na tym, że zawsze masz informacje profilujące. Ilekroć uruchamiam emacsa, mam w*Messages*
buforze wiele linii, które mówią mi, która część trwała. Jeśli wykryję coś nienormalnego, mogę użyć dowolnego z bardziej odpowiednich narzędzi do profilowania i optymalizacji rzeczy.emacs-init-time
produkuje ciekawe informacje. Daje to jednak tylko czas, który upłynął, bez możliwości rozbicia poszczególnych części inicjalizacji.Oprócz odpowiedzi @ Malabarba, pamiętaj, że możesz zmierzyć skompilowany czas wykonania swojego kodu
benchmark-run-compiled
. Ta metryka jest często znacznie bardziej odpowiednia niż interpretowany czas wykonania, któryM-x benchmark
zapewnia:Te trzy liczby to całkowity czas, który upłynął, liczba przebiegów GC i czas spędzony w GC.
źródło
Benchmarking to nie tylko uzyskiwanie liczb, ale także podejmowanie decyzji w oparciu o analizę wyników.
Na MELPA znajduje się pakiet benchstat.el , za pomocą którego można uzyskać funkcje oferowane przez program benchstat .
Implementuje testy porównawcze oparte na porównaniu, w których porównuje się
X
właściwości wydajnościY
.Funkcje Benchstat można postrzegać jako
benchmark-run-compiled
opakowanie, które nie tylko zbiera informacje, ale daje je w łatwym do odczytania formacie interpretacji. Obejmuje:X
iY
Bardzo prosty przykład użycia:
benchstat-compare
Odda wyniki w tymczasowym buforze:Będziesz jednak potrzebował
benchstat
programu binarnego. Jeśli używałeś języka programowania Go, najprawdopodobniej już go masz. W przeciwnym razie istnieje możliwość skompilowania go ze źródeł.Wstępnie skompilowane pliki binarne dla systemu Linux / amd64 można znaleźć na stronie wydania github .
źródło