Emacs ガベージコレクションの発動頻度設定|gc-cons-threshold

この記事は約2分で読めます。

さて前回は下記の記事を書きました。
https://hangstuck.com/emacs-bidi-display-reordering/

今回もるびきちさん@日刊Emacs のおすすめ初期設定初期設定 (Software Design 2014年7月号掲載記事) の中の項目を見ていこうと思いきます。

おすすめ初期設定の中に下記のような設定があります。なんとなく変数名からわかるかもしれませんが、ガベージコレクトの発動する上限のメモリ使用量を増やしています。それにより、ガベージコレクタが発動しにくくなり、全体的に処理が軽くなるという寸法です。 gc-cons-threshold がその閾値です。デフォルトでは400000もしくは800000になっているかと思います。それを、下記の設定では10倍にしています。

;; GCを減らして軽くする.
(setq gc-cons-threshold (* gc-cons-threshold 10))

私の環境だと、この設定を有効にする(閉じカッコのところでC-x C-e)と 「8000000 (#o36411000, #x7a1200)」になりました。左から10進数、8進数、16進数ですね。確かにデフォルト値より10倍大きくなっています。

通常は、ひとまずこの設定を初期設定ファイル(.emacs, .emacs.d/init.el)に書いておけば問題ないと思います。ただ、ガベージコレクトはシステムの裏で処理されるので、我々ユーザからは発動したかどうかがわかりません。そこで、ガベージコレクタの発動したタイミングを知りたい場合は下記の設定を追加します。

(setq garbage-collection-messages t)

これを有効にすると、ガーベジコレクタが走った時にエコーエリアに「Garbage Collecting…done」と表示されます。つまりこの表示が頻繁にされるようなら、gc-cons-threshold の値をさらに大きくした方が Emacs の動作は軽くなる可能性があります。ほとんど表示されないなら、現状の設定で充分でしょう。

逆に、おそらく最近の PC ではないと思いますが、Emacs 使用時に PC全体が重くなるようでしたら、あえてガベージコレクタの発動の閾値を下げるのも必要かもしれません。下記の例は閾値を1/10にする例です。

;; GCの上限閾値をあえて下げる.
(setq gc-cons-threshold (/ gc-cons-threshold 10))

そんなにこだわるようなところでもないので、ひとまず10倍にしておいて、困らなければそれでOKだと思います。
以上、Emacs GC の閾値の設定の解説でした

コメント