Zbuduj minimum Emacsa 25 do testów jednostkowych

10

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-alldo ./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 installdrukować wcale.

księżycowy
źródło
Czy planujesz to zrobić na platformie CI? Jeśli nie, jakiego komputera używasz? Oczywiście szybkość kompilacji będzie bardzo zależała od twojego procesora, ale dla mnie ./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ód make install? To doda trochę czasu, którego można by uniknąć, uruchamiając emacsa z katalogu src.
Jordon Biondo,
To Travis CI, ale nie rozumiem, dlaczego to ma znaczenie? To ogromna różnica między dwiema różnymi wersjami Emacsa na tej samej maszynie, którą chciałbym wyjaśnić. IOW, dlaczego magistrala ta pięć razy dłużej buduje na tym samym systemie ?
lunaryorn
Budowanie z repozytorium musi tworzyć określone pliki, które są już obecne w rozproszonych archiwach.
politza
@politza Jakie pliki? Wiem, że muszę ./autogen.shgenerować configure, ale to kwestia sekund, a nie minut.
lunaryorn
2
@lunaryom Masz tutaj trzy osobne pytania. 1: jak szybko budować emacsa, 2: dlaczego emacs 25 buduje się wolniej niż emacs 24.5 i 3: jak make installcicho 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.
skalista

Odpowiedzi:

8

Powodem, dla którego 24.5 buduje się dla ciebie tak szybko, jest fakt, że .elcpliki są faktycznie dystrybuowane w archiwum, zobacz make-dist . Podczas budowania z git większość czasu spędza na kompilacji .elplikó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?).

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 installdrukować wcale.

Zawsze możesz przekierować wyjście na /dev/null. W moich eksperymentach potokowałem dane make installwyjściowe, aby grep -E '^(make|[A-Z])'zmniejszyć dane wyjściowe (javascript Travis CI, który formatuje dziennik w Internecie, miał problem z pełnym wyjściem).

czy mogę zmusić Emacsa do budowania tak szybko, jak Emacs 24.5?

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.

npostavs
źródło
3

Oto różne sugestie.

  1. Brak plików elc.

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/Makefilei zmiana tego na:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Brak optymalizacji kompilatora lub tabel symboli debugera

Obecnie przekazuję --with-x-toolkit = no --without-x --without-all do ./configure.

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=''.

  1. Nie uruchamiaj 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, uruchom remake --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 --profileopcję 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.

skalisty
źródło
„20% czasu spędza się na budowaniu seplenienia” - Sklonowałem repozytorium emacs-travis @ lunaryorn, wygląda na to, że make lispzajmuje około 60% Emacsa 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . Duża część make srckompiluje również seplenie, więc zastanawiam się, jak pogodzić te pomiary. W Emacsie 24 wygląda na to, że tylko kompiluje cc-*.elpliki make lisp, czy to błąd?
npostavs
Może to być złudzenie optyczne, ale wydaje mi się, że twoje zdjęcie profilujące stanowi tylko około 50% całości.
npostavs
Remake @ npostavs profiluje tylko czas celu, nie obejmuje samego siebie. Jest możliwe i prawdopodobne, że przy wszystkich plikach i katalogach znajdujących się w lisp, znaczna część czasu poświęcana jest na „remake” / „make” przy obliczaniu, co należy przerobić. Ponadto, mimo że „remake” jest rozwidleniem marki, więc to, co robią, jest podobne, dla dokładniejszych porównań powinieneś porównać czasy wyników profilowania remake'a z „remake” bez profilowania, a nie „make”. A także z tym samym remake / zrobić wersję. Wreszcie, chociaż można spierać się z%, i tak dalej, ogólne sugestie wydają się obowiązywać przy użyciu twoich danych.
rocky
Ponadto mój pomiar był używany, CFLAGS=''co powoduje, że kompilacja C jest szybsza, a kompilacja lisp wolniejsza. Jak się okazuje, użycie CFLAGS='-O2 -march=native'jest ogólnie szybsze dla Emacsa 25, choć wolniejsze dla Emacsa 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs
@npostavs Obserwujesz: ustawienie CFLAGS „powoduje, że kompilacja C jest szybsza, a kompilacja lisp wolniejsza”. Ale jeśli zamierzasz przeprowadzić pojedynczy test, nie jestem pewien, czy całkowity czas: jakaś zoptymalizowana kompilacja C / kompilacja + kompilacja LISP + uruchomienie testowe LISP będzie mniejsza niż niezoptymalizowana kompilacja / kompilacja C + brak LISP kompilacja + uruchomienie testowe LISP.
skalisty