Gibt es einen Nachteil, wenn man die Schwelle für "gc-cons-threshold" sehr hoch setzt und im Leerlauf Müll sammelt?

17

Ich habe die folgenden zwei Zeilen oben in meine eingefügt init.el:

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

Das bedeutet, dass Emacs nicht alle 800 KB des zugewiesenen Speichers den Müll einsammelt, sondern im Leerlauf, wenn mich das Anhalten nicht stört. (Es sammelt sich auch nach der Zuweisung von 1 GB Speicher, aber ich glaube nicht, dass das passieren wird).

Dies verbesserte meine Startzeit um ungefähr zwei Drittel. Theoretisch sollte es auch die Leistung im Allgemeinen verbessern. Gibt es Nachteile bei diesem Ansatz?

Erik
quelle
1
Grundsätzlich sollten Sie nicht gesetzt gc-cons-thresholdnicht höher als Sie bereit sind, tatsächlich zu einem bestimmten Zeitpunkt getroffen, da sollten Sie davon ausgehen , dass Sie wird tatsächlich diesen Wert ab und zu schlagen (denn wer weiß , wie viel Müll könnte auflaufen durch eine unerwartet begeisterte nichtleerlaufende Aufgabe). Ich sehe kein besonderes Problem beim Auslösen von gc mit einem Leerlauf-Timer, aber ich denke, die Schwelle für nicht-Leerlauf-gc so hoch einzustellen, wie dies OTT scheint, und mein Eindruck ist, dass der Wert wahrscheinlich als "höher als ich" gewählt wurde Ich brauche immer "anstatt" das Höchste, das ich verwenden möchte ".
Phils
5
In diesem Beitrag von Stefan Monnier heißt es : "Fass es besser nicht an. In Emacs-22 haben wir den Prozentsatz der Gc-Cons eingeführt, der den gleichen Vorteil bietet wie die Erhöhung der Gc-Cons-Schwelle, aber ohne die Nachteile. Und ohne damit herumzuspielen." Dh, ich würde Benutzern empfehlen, alle Einstellungen für den gc-cons-Schwellwert von ihren .emacs zu entfernen. "
Izkon
1
@izkon mit der Ausnahme, dass der von Ihnen verknüpfte Beitrag aus dem Jahr 2007 stammt, während z. B. dieser Beitrag , in dem tatsächlich jemand experimentiert hat - und das Ändern des Schwellenwerts den Unterschied ausmachte - aus dem Jahr 2016 stammt gut gearbeitet.
Hi-Angel
1
@Erik Ich glaube , Sie ersetzen können (eval-when-compile (* 1024 1024 1024))mit most-positive-fixnum (tun Sie dies bitte, ich bin ziemlich sicher , dass jeder, der über Ihre Frage Kopien kommt Ihr Code in ihre config) .
Hi-Angel
2
@ Hi-angel ich halte das nicht für eine gute idee. Wenn Emacs tatsächlich große Mengen an Arbeitsspeicher zuweist, ohne inaktiv zu werden, sollte er gc so lange zuweisen, bis das System den Arbeitsspeicher austauschen muss oder gar nicht mehr genügend Arbeitsspeicher zur Verfügung steht. Wenn überhaupt, ist 1 GB bereits zu hoch.
Erik

Antworten:

4

Soweit ich weiß, ist es in Ordnung, wenn Sie über RAM verfügen, aber wenn Emacs vor dem GC-Vorgang jemals eine sehr hohe Auslastung aufwies, kann dies lange dauern. Ich weiß nicht genau, was Eli meint. ISTM, wenn Sie genug Gedächtnis haben, sollte es okay sein, aber er ist der Experte hier.

Allerdings habe ich diese Zeilen in meiner Init-Datei schon eine Weile verwendet, und es hilft, die Startzeit zu verkürzen, ohne die Änderungen dauerhaft zu machen:

;;;;; 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
quelle
Warum benutzt du nicht after-init-hook?
Erik
3
Da dies unmittelbar nach der Initialisierung ausgeführt wird, kann der Benutzer auf die GC warten. Durch die Verwendung eines Leerlaufzeitgebers kann dieser ausgeführt werden, wenn der Benutzer keinen Emacs verwendet.
blujay