C'è qualche svantaggio nell'impostare `gc-contro-soglia` molto alto e nel raccogliere immondizia quando è inattivo?


17

Ho aggiunto le seguenti due righe all'inizio del mio init.el:

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

Ciò significa che invece di raccogliere immondizia ogni 800kb di memoria allocata, Emacs lo fa quando è inattivo, cioè quando la pausa non mi disturba. (Si raccoglie anche dopo aver allocato 1 GB di memoria, ma non penso che accadrà).

Ciò ha migliorato il mio tempo di avvio di circa due terzi. In teoria, dovrebbe anche migliorare le prestazioni in generale. Ci sono aspetti negativi di questo approccio?


1
In linea di principio non si dovrebbe impostare gc-cons-thresholdpiù in alto di quanto si è disposti a colpire in realtà in un dato momento, perché si dovrebbe supporre che sarà in realtà ha colpito che il valore di volta in volta (dopo tutto, chi sa quanta immondizia potrebbe maturerà da un compito inattivo inaspettatamente entusiasta). Non vedo un problema particolare con l'attivazione di gc con un timer inattivo, ma penso che l'impostazione della soglia per gc non inattivo sia così alta come sembra OTT, e la mia impressione è che il valore sia stato probabilmente scelto come "più alto di me avrò mai bisogno di "piuttosto che" il massimo che sono disposto a usare ".
phils,

5
Secondo questo post di Stefan Monnier : "Meglio non toccarlo. In Emacs-22 abbiamo introdotto la percentuale di contro-gc che offre lo stesso vantaggio dell'aumento della soglia di contro-gc ma senza gli svantaggi. E senza dover giocherellare. Vale a dire che consiglierei agli utenti di rimuovere tutte le impostazioni di gc-contro-soglia dai loro .emacs. "
izkon,

1
@izkon, tranne per il fatto che il post che hai collegato risale al 2007, mentre ad esempio questo post , in cui qualcuno ha effettivamente sperimentato - e cambiare la soglia ha fatto la differenza - risale al 2016. Quindi o è regredito o la soluzione alternativa non ha mai ha funzionato bene.
Ciao Angelo

1
@Erik Penso che puoi sostituirlo (eval-when-compile (* 1024 1024 1024))con most-positive-fixnum (per favore fallo, sono abbastanza sicuro che tutti coloro che incontrano la tua domanda copiano il tuo codice nella loro configurazione) .
Hi-Angel,

2
@ Ciao Angelo, non penso sia una buona idea. Se Emacs alloca effettivamente enormi quantità di memoria senza diventare inattivo, dovrebbe gc invece di continuare ad allocare fino a quando il sistema non deve scambiare o addirittura esaurire completamente la memoria. Semmai, 1 GB è già troppo alto.
Erik,

Risposte:


4

Per quanto ne so, se hai la RAM, va bene, ma se Emacs avesse mai raggiunto un utilizzo molto elevato prima del GC, potrebbe richiedere molto tempo. Non sono sicuro di cosa significhi Eli; ISTM che se hai abbastanza memoria, dovrebbe andare bene, ma è l'esperto qui.

Detto questo, ho usato queste righe nel mio file init per un po 'di tempo, e aiuta a ridurre i tempi di avvio senza rendere permanenti le modifiche:

;;;;; 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")))

Perché non usi after-init-hook?
Erik,

3
Perché ciò verrebbe eseguito immediatamente dopo l'inizializzazione, il che potrebbe indurre l'utente ad attendere GC. Utilizzando un timer di inattività, può essere eseguito quando l'utente non utilizza Emacs.
Blujay,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.