Co mogę zrobić, aby skrócić czas uruchamiania?
Czy jest coś szczególnego, na co powinienem zwrócić uwagę?
Uwaga: Czas uruchamiania można ograniczyć, rzadziej uruchamiając Emacsa (raz na sesję) i otwierając pliki w działającej instancji . To pytanie dotyczy zminimalizowania czasu uruchamiania, rozpoczęcia sesji lub w dowolnym innym momencie, gdy konieczne jest uruchomienie Emacsa.
Zobacz także to samo pytanie, na które odpowiedziano na temat Przepełnienia stosu, z wynikami pytań i odpowiedzi powyżej 50 i 30-niektórych „ulubionych” zakładek. Dobre odpowiedzi tutaj powinny wykraczać poza to, co jest dostępne w przepełnieniu stosu.
init-file
performance
start-up
caisah
źródło
źródło
Odpowiedzi:
Oto moje uwagi na temat zmniejszania
emacs-init-time
, nie obejmuje to takich rzeczy jak używanie demona lub serwera, nie trzeba dodawać, że rzadko powinieneś zamykać emacsa.Nie:
Nie wymagaj pakietów w swoim init, jeśli pakiet nie ma odpowiednich plików cookie z automatycznym ładowaniem, upewnij się, że skonfigurowałeś automatyczne ładowanie dla poleceń wejściowych. Jeśli więc po raz pierwszy użyjesz pakietu
foobar
, dzwoniącfoobar-mode
ifoobar
nie był on wstępnie ładowany automatycznie, potrzebujesz czegoś takiego:pozwoli ci to zadzwonić,
foobar-mode
nawet jeślifoobar
pakiet nie został jeszcze załadowany. Ten sposóbfoobar
nie zostanie załadowany, dopóki nie zadzwoniszfoobar-mode
Nie uruchamiaj,
package-refresh-contents
jeśli nie musisz instalować pakietów podczas uruchamiania. Jeśli twój init jest skonfigurowany do automatycznej instalacji brakujących pakietów, zastanów się nad ustawieniem arg wiersza poleceń, aby określić, kiedy powinna nastąpić automatyczna instalacja.desktop
init, chyba że naprawdę chcesz.Robić
Użyj czegoś takiego,
use-package
aby zarządzać swoimi pakietami. Ułatwia to określenie, czego wymagać, co załadować później, co automatycznie ładuje i co ułatwia profilowanie Twojego init na podstawie pakietu.Poznaj różnicę między ładowaniem motywu a włączaniem go. Krótko mówiąc, możesz załadować tyle, ile chcesz, ale upewnij się, że nie włączasz więcej niż jednego. Najlepiej załaduj i włącz tylko jeden motyw.
load-theme
potrzebuje opcjonalnego argumentu, aby zapobiec włączeniu motywu. Przypadkowe włączenie wielu motywów, które jest powolne i brzydkie podczas uruchamiania, może być łatwe.Oszukiwać: Często są duże globalne tryby, które chcesz załadować przy inicjowaniu, takie jak cofanie drzewa, autouzupełnianie, tryb ido itp. Upewnij się, że funkcje wejścia mają konfigurację autoloadowania, a następnie uruchom bezczynniki czasowe w init, aby załadować pakiety . Robię to
undo-tree-mode
,ido
i inni, i nigdy nie zauważam opóźnienia, ponieważ do czasu, gdy faktycznie muszę ich użyć, są już załadowane.Aktualizacja: pakiet use nieco się zmienił, przeczytaj oficjalny plik Readme przed rozpoczęciem korzystania z funkcji timera.
Na przykład: jeśli chcesz nieco opóźnić ładowanie,
global-undo-tree-mode
możesz umieścić to w swoim init:Teraz twój init może kontynuować szczęśliwie i
global-undo-tree-mode
nie zostanie aktywowany, dopóki wszystko inne nie będzie gotowe i nie będziesz za kierownicą.use-package
obsługuje wbudowane tego typu zachowanie za pomocą słowa kluczowego: idle. Otoundo-tree
konfiguracja z mojego .init.el:Zrób profil swojego init, zawsze zaskakujące jest, gdzie są prawdziwe spowolnienia. profile-dotemacs.el jest niesamowitym narzędziem, którego użyłem, aby pomóc mi obniżyć mój init z ~ 6 sekund do <1 sekundy.
Dobrze skonfigurowany
use-package
init może być niezwykle szybki. Nie kompiluję bajtowo mojego init, który używause-package
do skonfigurowania 95 pakietów i uruchamia się w <1 sekundę.źródło
(require 'org)
linia. :-)(run-with-idle-timer 1 nil #'global-undo-tree-mode)'. If the function you are loading takes parameters you can just provide them after the
polecenie # ''.Coś, co ostatnio pojawiło się na emacs reddit : zmniejsz liczbę wywołań odśmiecania, umieszczając to na początku pliku init:
W powyższym przykładzie GC jest wywoływane co ~ 50 MB (zamiast domyślnie ~ 800kb), co wydaje się sensowne w nowoczesnym systemie z dużą ilością pamięci RAM.
źródło
emacs-startup-hook
to dobre miejsce do zrobienia tego.Czas spędzony na optymalizacji czasu uruchamiania będzie prawdopodobnie dłuższy niż cały dodatkowy czas, który w innym przypadku czekałby na uruchomienie Emacsa.
W tej chwili
require
wykonuję 25 wywołań w moim pliku init, aby Flycheck mógł znaleźć błędy ortograficzne w moim kodzie. Mój czas uruchamiania to ...Ponadto, w moim systemie,
time emacs -Q --eval '(save-buffers-kill-terminal)'
mareal
od0m0.404s
. Teoretycznie maksymalny czas, jaki mogę zaoszczędzić, to 2,3 sekundy.Powiedz, że spędzam godzinę na optymalizacji całego pliku init. (Nie liczę dodatkowych 15-30 minut spędzonych w późniejszym terminie, próbując dowiedzieć się, dlaczego moje zmiany nie obowiązywały z powodu skompilowania mojego pliku init.) (Nie liczę też czasu, w którym Flycheck uratowałby mnie w debugerze, gdybym nie usunął
require
połączeń.) Są 3600 sekund na godzinę, więc jeśli uda mi się zaoszczędzić całe 2,3 sekundy, moja inwestycja w czas zwróci się dopiero po 1565 uruchomieniach.Zakładając, że restartowałem Emacsa 3 razy dziennie, każdego dnia potrzeba półtora roku, aby inwestycja się zwróciła. Gdybym pozostawił tę samą instancję Emacsa działającą przez kilka dni (tak jak często to robię), prawdopodobnie uruchomiłbym tylko 2-5 razy w tygodniu, w którym to przypadku zwrot inwestycji trwałby od 6 do 15 lat.
Jestem hojny, ponieważ prawdopodobnie spędzisz ponad godzinę optymalizując swój start i prawdopodobnie nie zaoszczędzisz maksymalnej teoretycznej liczby sekund.
źródło