Wie messe ich die Leistung meines Elisp-Codes? Welche Tools / externen Pakete stehen mir zur Verfügung, um die benötigte Zeit zu messen?
Kann ich zusätzlich zur Gesamtzeit ein Profil sehen, das die pro Funktion benötigte Zeit anzeigt? Kann ich auch die Speichernutzung profilieren?
performance
benchmarking
Wilfred Hughes
quelle
quelle
benchmark
und dem Profiler bereitgestellte misst nicht die Emacs- Leistung. Es misst die Leistung bei der Bewertung bestimmter Ausdrücke. Es ist hilfreich, um die Leistungen innerhalb von Emacs zu vergleichen. Um die Leistung von Emacs selbst zu messen, müssten Sie sie mit der Leistung von etwas anderem als Emacs vergleichen. Und hier kommt die Breite von Emacs ins Spiel. Sie könnten Emacs gegen XYZ für dieses oder jenes messen, aber um die Leistung von Emacs als Ganzes zu messen, würden Sie unzählige solcher Vergleiche benötigen.Antworten:
Benchmark
Die einfachste Option ist das eingebaute
benchmark
Paket. Die Bedienung ist denkbar einfach:Es wird automatisch geladen, sodass Sie es nicht einmal benötigen.
Profiling
Benchmark ist gut für allgemeine Tests, aber wenn Sie Leistungsprobleme haben, können Sie nicht feststellen, welche Funktionen das Problem verursachen. Dafür haben Sie den (auch eingebauten) Profiler .
M-x profiler-start
.M-x profiler-report
.Sie sollten zu einem Puffer mit einem navigierbaren Baum von Funktionsaufrufen geführt werden.
quelle
benchmark
Funktion scheint nicht zu funktionieren: Wenn ich in einer geöffneten.c
Datei mache, bekomme(benchmark 100 (c-font-lock-fontify-region 0 17355))
ich immervoid-function jit-lock-bounds
.benchmark
gibt es funktionenbenchmark-run
undbenchmark-run-compiled
. Für mich war der Hauptunterschied, dass beide Funktionen tatsächlich funktionieren (siehe vorheriger Kommentar) : ЬZusätzlich zu der Antwort von @ Malabara verwende ich normalerweise ein benutzerdefiniertes
with-timer
Makro, um verschiedene Teile meines Codes (zinit.el
. B. meine Datei) permanent zu instrumentieren .Der Unterschied besteht darin, dass Sie zwar
benchmark
die Leistung eines bestimmten von Ihnen instrumentierten Codebits untersuchen können, jedochwith-timer
immer die Zeit für jeden instrumentierten Teil des Codes haben (ohne großen Aufwand für ausreichend große Teile), wodurch Sie die Eingabe erhalten, die Sie wissen müssen welcher Teil soll weiter untersucht werden.Beispiel Verwendung:
ergibt folgende Ausgabe im
*Messages*
Puffer:Ich sollte erwähnen, dass dies stark von Jon Wiegleys
use-package-with-elapsed-timer
Makro in seiner exzellentenuse-package
Erweiterung inspiriert ist .quelle
emacs-init-time
.esup
und ich mag es. Aber noch einmal, das Interesse an so etwaswith-timer
ist nicht so sehr, etwas gründliches zu profilieren. Das wirkliche Interesse ist, dass Sie immer Profilinformationen haben. Wann immer ich Emacs starte, habe ich ein Buch mit Zeilen in meinem*Messages*
Puffer, die mir sagen, welcher Teil wie lange gedauert hat . Wenn ich etwas Ungewöhnliches feststelle, kann ich eines der besser geeigneten Tools zum Profilieren und Optimieren verwenden.emacs-init-time
liefert interessante Informationen. Es gibt jedoch nur eine inklusiv verstrichene Zeit, ohne die Möglichkeit, einzelne Teile der Initialisierung zu zerlegen.Beachten Sie, dass Sie neben der Antwort von @ Malabarba auch die kompilierte Ausführungszeit Ihres Codes mit messen können
benchmark-run-compiled
. Diese Metrik ist häufig viel relevanter als die interpretierte Ausführungszeit,M-x benchmark
die Ihnen Folgendes bietet:Die drei Zahlen sind die insgesamt verstrichene Zeit, die Anzahl der GC-Läufe und die Zeit, die im GC verbracht wurde.
quelle
Beim Benchmarking geht es nicht nur darum, die Zahlen zu ermitteln, sondern auch darum, Entscheidungen auf der Grundlage von Ergebnisanalysen zu treffen.
Auf MELPA gibt es das Paket benchstat.el, mit dem Sie die Funktionen des Programms benchstat abrufen können .
Es implementiert ein vergleichsbasiertes Benchmarking, mit dem Sie
X
Leistungseigenschaften vergleichenY
.Benchstat-Funktionen können als
benchmark-run-compiled
Wrapper betrachtet werden, der die Informationen nicht nur sammelt, sondern sie in einem leicht lesbaren Interpretationsformat zurückgibt. Es enthält:X
undY
Sehr einfaches Anwendungsbeispiel:
Das
benchstat-compare
Ergebnis wird in einem temporären Puffer dargestellt:Sie benötigen jedoch
benchstat
Programm-Binärdateien. Wenn Sie die Programmiersprache Go verwendet haben, haben Sie höchstwahrscheinlich bereits eine in Ihrem System. Ansonsten besteht die Möglichkeit, es aus den Quellen zu kompilieren.Vorkompilierte Binärdateien für Linux / AMD64 finden Sie auf der Github-Release-Seite .
quelle