¿Hay alguna desventaja en establecer 'gc-cons-umbral' muy alto y recolectar basura cuando está inactivo?

17

Agregué las siguientes dos líneas en la parte superior de mi init.el:

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

Eso significa que en lugar de recolectar basura cada 800kb de memoria asignada, Emacs lo hace cuando está inactivo, es decir, cuando la pausa no me molesta. (También se acumula después de asignar 1 GB de memoria, pero no creo que eso suceda).

Esto mejoró mi tiempo de inicio en aproximadamente dos tercios. En teoría, también debería mejorar el rendimiento en general. ¿Hay alguna desventaja en este enfoque?

Erik
fuente
1
En principio no debe establecer gc-cons-thresholdmás alto de lo que realmente está dispuesto a golpear en cualquier momento dado, porque se debe asumir que va a realmente llegar a ese valor de vez en cuando (después de todo, ¿quién sabe cómo podría devengar mucha basura por alguna tarea inesperadamente entusiasta no inactiva). No veo un problema particular con la activación de gc con un temporizador inactivo, pero creo que establecer el umbral para gc no inactivo tan alto como parece OTT, y mi impresión es que el valor probablemente fue elegido como "más alto que yo" Alguna vez necesitaré "en lugar de" lo más alto que estoy dispuesto a usar ".
phils
55
De acuerdo con este post de Stefan Monnier : "Mejor no tocarlo. En Emacs-22 introdujimos gc-cons-percent que proporciona el mismo beneficio que aumentar el umbral de gc-cons-pero sin los inconvenientes. Y sin tener que tocarlo. Es decir, recomendaría a los usuarios que eliminen cualquier configuración de umbral gc-cons de sus .emacs ".
izkon
1
@izkon, excepto que la publicación a la que se vinculó data de 2007, mientras que, por ejemplo, esta publicación , donde alguien realmente ha experimentado, y cambiar el umbral marcó la diferencia, se remonta a 2016. Por lo tanto, retrocedió o la solución simplemente nunca funcionado bien.
Hola Angel
1
@Erik Creo que se puede reemplazar (eval-when-compile (* 1024 1024 1024))con most-positive-fixnum (realice esta acción, estoy bastante seguro de todo el mundo que viene a través de las copias de interrogación el código en su configuración) .
Hola Angel
2
@ Hola, Ángel. No creo que sea una buena idea. Si Emacs realmente asigna grandes cantidades de memoria sin estar inactivo, debería gc en lugar de continuar asignando hasta que el sistema tenga que intercambiar o incluso se quede sin memoria por completo. En todo caso, 1 GB ya es demasiado alto.
Erik

Respuestas:

4

Hasta donde sé, si tiene la RAM, está bien, pero si Emacs alguna vez alcanzó un uso realmente alto antes de GC, podría llevar mucho tiempo. No estoy seguro exactamente de lo que quiere decir Eli; ISTM dice que si tienes suficiente memoria, debería estar bien, pero él es el experto aquí.

Dicho esto, he usado estas líneas en mi archivo de inicio durante un tiempo, y ayuda a reducir el tiempo de inicio sin hacer que los cambios sean permanentes:

;;;;; 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
fuente
¿Por qué no lo usas after-init-hook?
Erik
3
Porque eso se ejecutaría inmediatamente después de la inicialización, lo que podría hacer que el usuario espere a GC. Al usar un temporizador inactivo, puede ejecutarse cuando el usuario no usa Emacs.
blujay