Erstellen Sie einen minimalen Emacs 25 für Unit-Tests

9

Ich möchte eine sehr minimale Variante des Emacs-Kofferraums bauen, um mein Emacs Lisp-Paket zu testen. Der Build benötigt keine grafische Benutzeroberfläche, keine Image-Unterstützung usw. Er sollte im Wesentlichen nur ein minimaler Emacs Lisp-Interpreter mit den Emacs Lisp-Kernbibliotheken sein und schnell erstellt werden , idealerweise in weniger als fünf Minuten.

Derzeit gehe ich --with-x-toolkit=no --without-x --without-allzu ./configure. Nachdem es fertig ist, wird mir mitgeteilt, dass alle Emacs-Funktionen deaktiviert sind, aber der Build dauert leider immer noch fast zehn Minuten .

Ich verstehe, dass es unmöglich sein könnte, Emacs schneller zu erstellen, aber was mich wundert, ist, dass Emacs 24.5 mit denselben Flags in nur zwei Minuten erstellt wird .

Was ist der Grund für diesen groben Unterschied und kann ich Emacs Kofferraum so schnell bauen lassen wie Emacs 24.5?

Und in einer verwandten Frage, wie kann ich Emacs dazu bringen, leise zu bauen? Derzeit sind fast 80% meiner Unit-Test-Ausgabe Emacs-Gebäude. Im Idealfall möchte ich, dass überhaupt make installkeine Ausgabe gedruckt wird.

Mondhorn
quelle
Planen Sie dies auf einer Art CI-Plattform? Wenn nicht, welche Art von Computer verwenden Sie? Natürlich wird die Build-Geschwindigkeit sehr stark von Ihrem Prozessor abhängen, aber für mich ist sie ./configure --with... && make -j (number of cores * 1.5)in 30 Sekunden fertig. Wenn Sie auf einem lokalen Computer ausgeführt werden, stellen Sie sicher, dass Sie das Argument -j verwenden. Gibt es einen guten Grund für Sie make install? Dies erhöht die Zeit, die Sie vermeiden könnten, wenn Sie nur Emacs aus dem src-Verzeichnis ausführen.
Jordon Biondo
Es ist Travis CI, aber ich verstehe nicht, warum das wichtig ist? Es ist der grobe Unterschied zwischen zwei verschiedenen Emacs-Versionen in derselben Maschine, den ich gerne erklärt hätte. IOW, warum baut Trunk das fünfmal länger auf, um auf demselben System aufzubauen ?
Mondhorn
Beim Erstellen aus einem Repository müssen bestimmte Dateien erstellt werden, die bereits in den verteilten Tarballs vorhanden sind.
Politza
@politza Welche Dateien? Ich weiß, dass ich laufen muss, um ./autogen.shzu generieren configure, aber das ist eine Frage von Sekunden, nicht von Minuten.
Mondhorn
2
@lunaryom Sie haben hier drei separate Fragen. 1: Wie man Emacs schnell baut, 2: Warum baut Emacs 25 langsamer als Emacs 24.5 und 3: Wie man make installes leise laufen lässt. Teilen Sie diese also bitte in 3 Fragen auf, damit sie separat verfolgt werden können, und bearbeiten Sie diese entsprechend, um bei einer Frage zu bleiben.
Rocky

Antworten:

7

Der Grund, warum 24.5 für Sie so schnell erstellt wird, ist, dass die .elcDateien tatsächlich im Tarball verteilt sind (siehe make-dist) . Beim Erstellen aus Git wird die meiste Zeit damit verbracht, die .elDateien zu kompilieren .elc. Durch die Optimierung des C-Codes kann die Lisp-Kompilierung schneller ausgeführt werden, dauert jedoch noch lange. Vergleichen Sie die Build-Zeiten mit Ihren ursprünglichen Einstellungen (~ 14 vs ~ 1 Minuten) mit einem Build mitCFLAGS='-O2 -march=native' (~ 9 vs ~ 1,5 Minuten).

Das Klonen von Git dauert ungefähr eine Minute, während das Herunterladen und Entpacken des Tarballs ungefähr 5 Sekunden dauert. Vergleichen Sie die Erstellungszeiten zwischen den Versionen, wenn Sie das Git-Archiv von Github herunterladen (~ 5, ~ 6, ~ 8 Minuten für v24.5, Master und Emacs-25). Wie Sie sehen können, wenn Sie keinen Distribution-Tarball verwenden, sind alle Die Erstellungszeiten liegen mindestens in der gleichen Größenordnung (nicht sicher, warum emacs-25 langsamer als master war, zufällige Abweichungen aufweisen konnte oder veralteter Code im Master entfernt wurde?).

Und in einer verwandten Frage, wie kann ich Emacs dazu bringen, leise zu bauen? Derzeit sind fast 80% meiner Unit-Test-Ausgabe Emacs-Gebäude. Im Idealfall möchte ich, dass überhaupt make installkeine Ausgabe gedruckt wird.

Sie können die Ausgabe jederzeit an umleiten /dev/null. Für meine Experimente habe ich die make installAusgabe an weitergeleitet grep -E '^(make|[A-Z])', um die Ausgabe zu reduzieren (das Travis CI-Javascript, das das Protokoll im Web formatiert, hatte Probleme mit der vollständigen Ausgabe).

Kann ich Emacs Trunk so schnell wie Emacs 24.5 bauen lassen?

Nein (oder ja in dem Sinne, dass Emacs 24.5 (fast) so langsam wie Emacs Trunk gebaut werden kann: p). Sie können jedoch den Emacs-Build speichern und das zwischengespeicherte Ergebnis für Unit-Tests herunterladen. Ich habe dies im Upload-Zweig meiner emacs-travis-Gabel implementiert. Hier ist ein Beispiel für die Verwendung durch yasnippet : Die Emacs-Installationszeit beträgt ~ 2,5 Sekunden.

npostavs
quelle
3

Hier sind verschiedene Vorschläge.

  1. Keine elc-Dateien.

Wie unten angegeben, macht das Kompilieren aller Lisp-Dateien mindestens 10% der Zeit aus. Eine Möglichkeit, dies zu deaktivieren, besteht darin, das loaddefs- Ziel in der Datei zu bearbeiten und in Folgendes zulisp/Makefile ändern:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Keine Compileroptimierung oder Debugger-Symboltabellen

Derzeit übergebe ich --with-x-toolkit = no --without-x --without-all an ./configure.

Ich konnte die C-Kompilierungszeit in der src auf 1/4 der Zeit (von etwas weniger als einer Minute auf 16 Sekunden) reduzieren, indem ich nur die Standard-Kompilierungsflags änderte. Die Standard-CFLAGS, die ich bekam, waren : -g -O3.

Verwenden Sie stattdessen CFLAGS=''.

  1. Nicht ausführen make install, sondern nur die erstellten Emacs aus dem src- Verzeichnis ausführen .

Wie unten angegeben, entfallen weitere 10% der Zeit auf die Erstellung von Dokumenten. Obwohl ich es nicht zeitlich festgelegt habe, gibt es zweifellos viel Zeit, um Dateien zu kopieren und elisp-Dateien zu komprimieren make install. Also nicht. Wenn Sie die Zeitdiagramme wiederholen möchten, führen Sie aus remake --profile.

Die obigen Beobachtungen basieren auf unten ....


Der erste Schritt besteht darin, zu verstehen, wo die Zeit aufgewendet wird, um herauszufinden, wie sie reduziert werden kann. Zum Glück für etwas wie Emacs habe ich kürzlich ein Tool geschrieben (oder eher erweitert), um Ihnen dabei zu helfen, es herauszufinden. Ich habe eine --profileOption zum Remake hinzugefügt (eine Gabel von GNU make), die Ihnen sagt, wie viel Zeit für bestimmte Ziele aufgewendet wird.

Ich habe versucht, einen aktuellen Schnappschuss zu erstellen, und ja, es dauert ungefähr 10 Minuten. Wenn Sie kein Remake installiert haben, habe ich einen Überblick über die Profilinformationen, die Sie für meinen Lauf verwenden können. Ich verwende kcachegrind, um die Informationen anzuzeigen, aber es gibt möglicherweise andere Tools für Visualisierungstools. Es gibt ein PNG im Kern, das ein Screenshot des Laufs ist.

Nun zu den Details ...

In meinem Lauf werden ungefähr 20% der Zeit für das Erstellen von Lisp- und Info-Dateien aufgewendet, die Sie nicht wirklich benötigen. Tatsächlich wird in den Lisp-Dateien etwas mehr ausgegeben als in den Info-Dateien. Sie könnten wahrscheinlich das Makefile ändern, um das zu überspringen.

Es könnte interessant sein, mit Emacs 24 zu vergleichen. Ich vermute, dass die Größe dieser beiden proportional gewachsen ist.

Wenn Interesse besteht (was Sie durch Upvotes zeigen können), schlage ich dem Makefile bestimmte Hacks vor. Dies allein sollte jedoch für jemanden ausreichen, der motiviert ist, von dort aus zu arbeiten.

felsig
quelle
"20% der Zeit wird für das Erstellen von Lisp aufgewendet" - Ich habe das Emacs-Travis- Repo von @ lunaryorn geklont. Es sieht so make lispaus, als würde Emacs 25 etwa 60% kosten : travis-ci.org/npostavs/emacs-travis/builds/91107858 . Und ein großer Teil davon make srckompiliert auch Lisp, daher frage ich mich, wie ich diese Messungen in Einklang bringen kann. In Emacs 24 sieht es so aus, als würde es nur cc-*.elDateien kompilieren. Ist make lispes ein Fehler?
Npostavs
Dies mag auch eine optische Täuschung sein, aber es scheint mir, dass Ihr Profilbild nur insgesamt etwa 50% ergibt.
Npostavs
@npostavs remake profiliert nur die Zeit des Ziels, es schließt sich nicht selbst ein. Es ist möglich und wahrscheinlich, dass bei allen Dateien und Verzeichnissen unter lisp viel Zeit für "Remake" / "Make" aufgewendet wird, um zu berechnen, was neu erstellt werden soll. Auch wenn 'remake' eine Gabelung von make ist, sollten Sie für genauere Vergleiche die Zeiten der Remake-Profiling-Ausgabe mit "remake" ohne Profiling vergleichen, nicht mit "make". Und auch mit demselben Remake / Version erstellen. Schließlich, obwohl man mit den% 's und so weiter streiten kann, scheinen die allgemeinen Vorschläge unter Verwendung Ihrer Daten zu gelten.
Rocky
Außerdem wurde meine Messung verwendet, CFLAGS=''wodurch die C-Kompilierung schneller und die Lisp-Kompilierung langsamer wird. Wie sich herausstellt, ist die Verwendung CFLAGS='-O2 -march=native'für Emacs 25 insgesamt schneller, für Emacs 24.5 jedoch langsamer: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs
@npostavs Sie beobachten: Das Setzen von CFLAGS "beschleunigt die C-Kompilierung und verlangsamt die Lisp-Kompilierung." Wenn Sie jedoch einen einzelnen Test ausführen möchten, bin ich mir nicht sicher, ob die Gesamtzeit: eine Art optimierter C-Kompilierung / Build + LISP-Kompilierung + LISP-Testlauf geringer ist als nicht optimierter C-Kompilierung / Build + kein LISP Kompilieren + LISP-Testlauf.
Rocky