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-all
zu ./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 install
keine Ausgabe gedruckt wird.
quelle
./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 Siemake install
? Dies erhöht die Zeit, die Sie vermeiden könnten, wenn Sie nur Emacs aus dem src-Verzeichnis ausführen../autogen.sh
zu generierenconfigure
, aber das ist eine Frage von Sekunden, nicht von Minuten.make install
es 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.Antworten:
Der Grund, warum 24.5 für Sie so schnell erstellt wird, ist, dass die
.elc
Dateien tatsächlich im Tarball verteilt sind (siehe make-dist) . Beim Erstellen aus Git wird die meiste Zeit damit verbracht, die.el
Dateien 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?).
Sie können die Ausgabe jederzeit an umleiten
/dev/null
. Für meine Experimente habe ich diemake install
Ausgabe an weitergeleitetgrep -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).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.
quelle
Hier sind verschiedene Vorschläge.
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 zu
lisp/Makefile
ändern: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=''
.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 ausremake --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
--profile
Option 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.
quelle
make lisp
aus, als würde Emacs 25 etwa 60% kosten : travis-ci.org/npostavs/emacs-travis/builds/91107858 . Und ein großer Teil davonmake src
kompiliert 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 nurcc-*.el
Dateien kompilieren. Istmake lisp
es ein Fehler?CFLAGS=''
wodurch die C-Kompilierung schneller und die Lisp-Kompilierung langsamer wird. Wie sich herausstellt, ist die VerwendungCFLAGS='-O2 -march=native'
für Emacs 25 insgesamt schneller, für Emacs 24.5 jedoch langsamer: travis-ci.org/npostavs/emacs-travis/builds/91142923