Chciałbym zbudować bardzo minimalny wariant pnia Emacsa do testowania jednostkowego mojego pakietu Emacs Lisp. Kompilacja nie wymaga GUI, wsparcia dla obrazu itp. Powinna być w zasadzie minimalnym interpretatorem Emacs Lisp z podstawowymi bibliotekami Emacs Lisp i powinna być budowana szybko , najlepiej w mniej niż pięć minut.
Obecnie przechodzę --with-x-toolkit=no --without-x --without-all
do ./configure
. Po zakończeniu mówi mi, że wszystkie funkcje Emacsa są wyłączone, ale niestety kompilacja trwa jeszcze prawie dziesięć minut .
Rozumiem, że szybsze budowanie Emacsa może być niemożliwe, ale zastanawiam się, że przy tych samych flagach Emacs 24.5 buduje się w zaledwie dwie minuty .
Jaki jest powód tak dużej różnicy i czy mogę sprawić, żeby pień Emacsa budował tak szybko, jak Emacs 24.5?
I w pokrewnym pytaniu, jak zmusić Emacsa do budowania po cichu? Obecnie prawie 80% moich wyników testów jednostkowych to Emacs. Idealnie, chciałbym nie make install
drukować wcale.
źródło
./configure --with... && make -j (number of cores * 1.5)
kończy się za 30 sekund. Jeśli pracujesz na komputerze lokalnym, pamiętaj, aby użyć argumentu -j. Czy masz ku temu dobry powódmake install
? To doda trochę czasu, którego można by uniknąć, uruchamiając emacsa z katalogu src../autogen.sh
generowaćconfigure
, ale to kwestia sekund, a nie minut.make install
cicho działać. Podziel je więc na 3 pytania, aby można je było śledzić osobno i odpowiednio je edytuj, aby zachować jedno pytanie.Odpowiedzi:
Powodem, dla którego 24.5 buduje się dla ciebie tak szybko, jest fakt, że
.elc
pliki są faktycznie dystrybuowane w archiwum, zobacz make-dist . Podczas budowania z git większość czasu spędza na kompilacji.el
plików.elc
. Dzięki optymalizacji kodu C kompilacja Lisp może działać szybciej, ale nadal zajmuje dużo czasu. Porównaj czasy kompilacji przy użyciu oryginalnych ustawień (~ 14 vs ~ 1 minut) z kompilacją przy użyciuCFLAGS='-O2 -march=native'
(~ 9 vs ~ 1,5 minuty).Również klonowanie z git zajmuje około minuty, podczas gdy pobieranie i rozpakowywanie tarballa zajmuje około 5 sekund. Porównaj czasy kompilacji między wersjami podczas pobierania archiwum git z github (~ 5, ~ 6, ~ 8 minut odpowiednio dla v24.5, master i emacs-25. Jak widać, gdy nie używasz tarballa dystrybucyjnego, wszystkie czasy kompilacji są co najmniej tego samego rzędu wielkości (nie wiesz, dlaczego emacs-25 działał wolniej niż master, może być przypadkową odmianą lub jakiś przestarzały kod został usunięty w master?).
Zawsze możesz przekierować wyjście na
/dev/null
. W moich eksperymentach potokowałem danemake install
wyjściowe, abygrep -E '^(make|[A-Z])'
zmniejszyć dane wyjściowe (javascript Travis CI, który formatuje dziennik w Internecie, miał problem z pełnym wyjściem).Nie (lub tak w tym sensie, że możesz zmusić Emacsa 24.5 do budowania (prawie) tak wolno, jak pień Emacsa: p). Możesz jednak zapisać kompilację Emacsa i pobrać ten buforowany wynik do testów jednostkowych. Zaimplementowałem to w gałęzi przesyłania mojego widelca emacs-travis, oto przykład użycia yasnippet : czas instalacji Emacsa wynosi ~ 2,5 sekundy.
źródło
Oto różne sugestie.
Jak stwierdzono poniżej, kompilacja wszystkich plików lisp stanowi co najmniej 10% czasu. Jednym ze sposobów na wyłączenie tego jest edycja celu loaddefs w pliku
lisp/Makefile
i zmiana tego na:Byłem w stanie skrócić czas kompilacji C do 1/4 czasu (z nieco mniej niż minuty do 16 sekund) w src, po prostu zmieniając domyślne flagi kompilacji. Domyślną CFLAGS Dostałem zostały:
-g -O3
.Więc użyj zamiast tego
CFLAGS=''
.make install
, ale po prostu uruchom wbudowane emacs z katalogu src .Jak stwierdzono poniżej, kolejne 10% czasu zajmuje tworzenie dokumentacji. Chociaż nie zdążyłem tego czasu, bez wątpienia dużo czasu kopiuje się i kompresuje
make install
. Więc nie rób tego. Jeśli chcesz powtórzyć wykresy czasowe, uruchomremake --profile
.Powyższe obserwacje opierają się na ...
Pierwszym krokiem jest zrozumienie, gdzie poświęcony jest czas, aby dowiedzieć się, jak go zmniejszyć. Na szczęście dla czegoś takiego jak Emacs, niedawno napisałem (a raczej rozszerzyłem) narzędzie, które pomoże ci się dowiedzieć. Dodałem
--profile
opcję przeróbki (widelec GNU), która powie ci, ile czasu spędzasz na określonych celach.Próbowałem zbudować ostatnią migawkę i tak, zajmuje to około 10 minut. Jeśli nie masz zainstalowanego remake'u, mam streszczenie informacji profilujących, które możesz wykorzystać w moim uruchomieniu. Używam kcachegrind do wyświetlania informacji, ale mogą istnieć inne narzędzia do wizualizacji. W treści znajduje się png, który jest zrzutem ekranu z biegu.
Teraz do szczegółów ...
W moim biegu około 20% czasu spędzam na tworzeniu plików lisp i informacji, których tak naprawdę nie trzeba robić. W rzeczywistości trochę więcej wydaje się na pliki lisp niż na pliki informacyjne. Prawdopodobnie możesz zmienić plik Makefile, aby to pominąć.
Interesujące może być porównanie z emacsem 24. Domyślam się, że rozmiary obu z nich wzrosły proporcjonalnie.
Jeśli jest zainteresowanie (które możesz pokazać poprzez upvotes), zasugeruję konkretne hacki Makefile. Jednak samo to powinno wystarczyć, aby ktoś zmotywowany do pracy.
źródło
make lisp
zajmuje około 60% Emacsa 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Duża częśćmake src
kompiluje również seplenie, więc zastanawiam się, jak pogodzić te pomiary. W Emacsie 24 wygląda na to, że tylko kompilujecc-*.el
plikimake lisp
, czy to błąd?CFLAGS=''
co powoduje, że kompilacja C jest szybsza, a kompilacja lisp wolniejsza. Jak się okazuje, użycieCFLAGS='-O2 -march=native'
jest ogólnie szybsze dla Emacsa 25, choć wolniejsze dla Emacsa 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923