TL; DR Mam tak dużą liczbę pakietów, że szkodzi to mojemu uruchomieniu. Jeśli nie uważasz, że może tak być, czytaj dalej.
Czas uruchamiania mojego Emacsa jest dość krótki. Nie używam use-package
, po prostu ustawiam mnóstwo haczyków autoload
, aby prawie cały kod został odroczony. W rzeczywistości całość jest ładowana zwykle w mniej niż pół sekundy, mimo że wydaje się to szalonym bałaganem.
Jednak z biegiem czasu zauważyłem, że mój czas uruchamiania dostaje drobiazgowo wolniej, w niewytłumaczalny sposób. W końcu doszło do momentu, w którym czas uruchamiania wynosi ≥ 1 sekundę. W końcu miałem dość i sięgnąłem do sedna problemu. W końcu skomentowałem cały ~/.emacs
plik i stwierdziłem, że czas uruchamiania wciąż wynosił ≥ 1 sekundę. W rzeczywistości ogolił się ~ 0.2
sekund, a czasem nawet krócej. Potem próbowałem emacs -q
i okazało się, że czas uruchamiania wynosił ~ 0.1
sekund.
Po zbadaniu tej sekcji podręcznika Elisp, dowiedziałem się dlaczego emacs -q
został skracając czas uruchamiania tyle. Najwyraźniej emacs -q
powstrzymuje Emacsa przed zrobieniem trzech rzeczy podczas uruchamiania:
- ładowanie pliku init
- ładowanie
default.el
pliku - powołanie
package-initialize
Wykluczyliśmy już mój plik inicjujący, ponieważ skomentowanie mojej całości ~/.emacs
prawie nic nie robi. Nie używam default.el
pliku, więc jest to również wykluczone. Co pozostawia package-initialize
winowajcę za hit.
Dlaczego package-initialize
zabiera tyle czasu na uruchomienie? To było pierwsze pytanie, które sobie zadałem. Czy nie ładuję wszystkiego automatycznie? No tak. Ale to jest właśnie problem.
Znalazłem ten post, który wyjaśnia, że „aktywowanie” pakietów polega na odczytywaniu plików autoload i ustawianiu ścieżek ładowania. To oczywiście powoduje karę we / wy, gdy masz wiele pakietów, ponieważ masz wiele plików autoload do odczytu i wiele ścieżek do ustawienia. Niestety bez tego zadanie zarządzania automatycznymi ładowaniami spada na użytkownika. Innymi słowy, nie pozwalając na package.el
indeksowanie systemu plików w celu automatycznego ładowania plików i ścieżek, musiałbym sam sobie z tym poradzić, co może być żmudnym i podatnym na błędy procesem.
Wolałbym nie iść tą drogą. Obecnie mam 116 pakietów, w tym 107 z ELPA, z czego 25 to zależności. Jestem pewien, że ta ogromna liczba tak bardzo obniża moją wydajność. Ale jestem w rozterce, ponieważ nie chcę usuwać żadnego z moich pakietów.
Czy w takiej sytuacji jest jakiś sposób na odzyskanie czasu uruchamiania błyskawicy?
Aktualizacja:
Rozpoczęliśmy nowy wątek na emacs-devel
liście mailowej o niektórych łatach autorstwa Stefana Monniera (opis tych łatek jest tutaj ), aby rozwiązać ten problem. Każdy może przetestować swoje łatki i wyrazić opinię.
Kolejna aktualizacja:
Wygląda na to, że Stefan Monnier albo nie jest już zainteresowany tym problemem, albo nie otrzymuje moich wiadomości. Jestem skłonny wierzyć w to pierwsze, co jest w porządku, chociaż byłbym wdzięczny za jakąś odpowiedź od niego, jeśli tak jest. Zresztą kod, który do tej pory stworzył dla tego problemu, działa całkiem dobrze. Najnowsze jego łaty można znaleźć tutaj (dla Emacsa 25.3) i tutaj (dla głównej gałęzi Emacsa).Zauważyłem dobre ulepszenia czasu uruchamiania dzięki jego łatkom i jestem w punkcie, w którym czuję się dobrze z czasem uruchamiania, o ile jest on zoptymalizowany tak, jak to możliwe, bez wyłączania funkcji mojego dostosowania. Miałem nadzieję, że te łaty w pewnym momencie znajdą się na linii głównej Emacsa, ale chyba (lub ktoś inny) musiałbym teraz zająć się pochodnią, zamiast Stefana. Mieliśmy trochę uwagi na liście mailingowej dotyczącej przypisywania praw autorskich i licencjonowania. Początkowo nie czułem się z tym dobrze, ale z powodu niektórych komentarzy Richarda Stallmana i innych, przypisanie praw autorskich może nie być tak restrykcyjne, jak początkowo myślałem. Ponadto może być możliwe przekazanie moich dzieł do domeny publicznej jako alternatywa dla przypisania praw autorskich.
W każdym razie dziękuję Stefanowi za dotychczasowe łaty! Mam nadzieję, że nadal będziecie rozwijać te zmiany, ale jeśli nie, to w porządku i mogę je w dalszym ciągu rozwijać. Dziękuję również wszystkim innym, którzy zaoferowali wgląd i wkład w rozwiązanie tego problemu.
Kolejna aktualizacja:
Wow, wygląda na to, że ta funkcja w końcu wylądowała i będzie w Emacs 27. Dzięki Stefan Monnier!
use-package
jest na to sposób.