Czy jest jakaś wada tego, że ustawienie „gc-cons-próg” jest bardzo wysokie i zbieranie śmieci podczas bezczynności?

17

Dodałem następujące dwie linie na górze mojej init.el:

(setq gc-cons-threshold (eval-when-compile (* 1024 1024 1024)))
(run-with-idle-timer 2 t (lambda () (garbage-collect)))

Oznacza to, że zamiast zbierać śmieci co 800 KB przydzielonej pamięci, Emacs robi to w stanie bezczynności, tj. Gdy wstrzymywanie mi nie przeszkadza. (Zbiera się również po przydzieleniu 1 GB pamięci, ale nie sądzę, aby tak się stało).

Poprawiło to mój czas uruchamiania o około dwie trzecie. Teoretycznie powinno to również ogólnie poprawić wydajność. Czy są jakieś wady tego podejścia?

Erik
źródło
1
Zasadniczo nie powinieneś ustawiać gc-cons-thresholdwyższych wartości, niż jesteś w stanie w danym momencie trafić, ponieważ powinieneś założyć, że od czasu do czasu osiągniesz tę wartość (w końcu kto wie, ile śmieci może zostać zgromadzonych przez jakieś nieoczekiwanie entuzjastyczne, nieużywane zadanie). Nie widzę szczególnego problemu z wyzwalaniem gc z bezczynnym zegarem, ale myślę, że ustawienie progu dla nie-bezczynności gc tak wysoko, jak to wydaje się OTT, i mam wrażenie, że wartość została prawdopodobnie wybrana jako „wyższa niż ja” „Zawsze będę potrzebować”, a nie „najwyższej, z jakiej jestem gotów korzystać”.
phils
5
Zgodnie z tym postem Stefana Monniera : „Lepiej tego nie dotykaj. W Emacsie-22 wprowadziliśmy procent gc-cons-procent, który zapewnia taką samą korzyść jak zwiększenie progu gc-cons-próg, ale bez wad. I bez konieczności manipulowania nim. Tzn. Zaleciłbym użytkownikom usunięcie wszelkich ustawień progów gc-cons z ich plików .emac. ”
izkon
1
@izkon z wyjątkiem tego, że post, do którego linkujesz, pochodzi z 2007 r., podczas gdy np. ten post , w którym ktoś faktycznie eksperymentował - i zmiana progu zrobiła różnicę - pochodzi z 2016 r. Więc albo się cofnął, albo obejście po prostu nigdy działało dobrze.
Cześć Angel
1
@Erik myślę, że można zastąpić (eval-when-compile (* 1024 1024 1024))z most-positive-fixnum (proszę zrobić tak, jestem całkiem pewny, że każdy, kto jest po drugiej stronie kopii zapytania kod do ich konfiguracji) .
Cześć Angel
2
@ Hi-Angel Nie sądzę, że to dobry pomysł. Jeśli Emacs faktycznie przydziela ogromne ilości pamięci, nie będąc bezczynnym, powinien gc zamiast kontynuować alokację, dopóki system nie będzie musiał zamienić lub nawet całkowicie zabraknie pamięci. Jeśli już, 1 GB jest już za wysoki.
Erik

Odpowiedzi:

4

O ile mi wiadomo, jeśli masz pamięć RAM, jest w porządku, ale jeśli Emacs kiedykolwiek miał bardzo wysokie zużycie przed GC'ing, może to zająć dużo czasu. Nie jestem pewien, co dokładnie znaczy Eli; ISTM, że jeśli masz wystarczającą ilość pamięci, powinno być w porządku, ale on jest tutaj ekspertem.

Powiedziawszy to, używałem już tych wierszy w moim pliku init i pomaga to skrócić czas uruchamiania bez powodowania trwałych zmian:

;;;;; Startup optimizations

;;;;;; Set garbage collection threshold

;; From https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/

(setq gc-cons-threshold-original gc-cons-threshold)
(setq gc-cons-threshold (* 1024 1024 100))

;;;;;; Set file-name-handler-alist

;; Also from https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/

(setq file-name-handler-alist-original file-name-handler-alist)
(setq file-name-handler-alist nil)

;;;;;; Set deferred timer to reset them

(run-with-idle-timer
 5 nil
 (lambda ()
   (setq gc-cons-threshold gc-cons-threshold-original)
   (setq file-name-handler-alist file-name-handler-alist-original)
   (makunbound 'gc-cons-threshold-original)
   (makunbound 'file-name-handler-alist-original)
   (message "gc-cons-threshold and file-name-handler-alist restored")))
blujay
źródło
Dlaczego nie używasz after-init-hook?
Erik
3
Ponieważ działałoby to natychmiast po inicjalizacji, co może spowodować, że użytkownik zaczeka na GC. Korzystając z bezczynnego timera, może on działać, gdy użytkownik nie używa Emacsa.
blujay