`gc-cons-threshold`を非常に高く設定し、アイドル時にガベージを収集することにはマイナス面はありますか?


17

次の2行をmyの先頭に追加しましたinit.el

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

つまり、割り当てられたメモリの800kbごとにガベージを収集するのではなく、Emacsはアイドル状態、つまり一時停止が気にならないときに収集します。(1GBのメモリを割り当てた後にも収集されますが、そうなるとは思いません)。

これにより、起動時間が約3分の2短縮されました。理論的には、一般にパフォーマンスも改善するはずです。このアプローチには欠点がありますか?


1
原則としてgc-cons-threshold、いつでも実際にヒットするよりも高く設定するべきではありません。なぜなら、その値を時々実際にヒットすると仮定する必要があるためです予想外に熱狂的な非アイドルタスク)。アイドルタイマーを使用してgcをトリガーする場合、特に問題は発生しませんが、非アイドルgcのしきい値をOTTのように高く設定すると、私の印象では、値はおそらく「私よりも高い」 「私が使用したいと思う最高のもの」ではなく、「必要になる」。
phils

5
よるとステファン・モニエことで、この記事「より良い、それを触れないでEmacsの-22我々は、GC-短所しきい値を増やすとしてではなく欠点がない同じ利点を提供し、GC-短所-割合を導入し、それをいじるする必要はありません。。つまり、ユーザーが.emacsからgc-cons-threshold設定を削除することをお勧めします。」
izkon

1
@izkonは、リンクした投稿が2007年に遡ることを除きます。たとえば、誰かが実際に実験を行った(そしてしきい値を変更すると違いが出た)この投稿は2016年に遡ります。うまくいきました。
ハイエンジェル

1
@Erik私はあなたが交換することができると思う(eval-when-compile (* 1024 1024 1024))most-positive-fixnum (そうしてください、私は彼らの設定にあなたの質問をコピーし、あなたのコードに出くわす皆かなり確信しています)
ハイエンジェル

2
@ Hi-Angelそれはいい考えだとは思いません。Emacsが実際にアイドル状態にならずに大量のメモリを割り当てる場合、システムがスワップするか完全にメモリを使い果たすまで割り当てを続ける代わりにgcを使用する必要があります。どちらかといえば、1GBはすでに高すぎます。
エリック

回答:


4

私の知る限り、RAMがあれば大丈夫ですが、EmacsがGCを実行する前に非常に高い使用率に達した場合、時間がかかる可能性があります。Eliが何を意味するのか正確にはわかりません。ISTMは、十分なメモリがあれば大丈夫ですが、彼はここのエキスパートです。

そうは言っても、私はしばらくの間、initファイルで次の行を使用しました。これにより、変更を永続的にすることなく、起動時間を短縮できます。

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

使ってみませんafter-init-hookか?
エリック

3
これは初期化の直後に実行されるため、ユーザーがGCを待機する可能性があるためです。アイドルタイマーを使用すると、ユーザーがEmacsを使用していないときに実行できます。
ブルージェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.