我在我的顶部添加了以下两行init.el
:
(setq gc-cons-threshold (eval-when-compile (* 1024 1024 1024)))
(run-with-idle-timer 2 t (lambda () (garbage-collect)))
这意味着Emacs不会在闲置时(即当暂停不打扰我时)这样做,而不是每分配800KB的内存收集垃圾。(它还会在分配1GB内存后收集,但我认为不会发生这种情况)。
这将我的启动时间缩短了大约三分之二。从理论上讲,它还应该总体上提高性能。这种方法有不利之处吗?
根据Stefan Monnier的这篇文章: “最好别碰它。在Emacs-22中,我们引入了gc-cons-percentage,它具有与增加gc-cons-threshold相同的好处,但是没有缺点。而且不必费力。也就是说,我建议用户从其.emacs中删除所有gc-cons-threshold设置。”
—
izkon
@Erik我想您可以替换
—
Hi-Angel
(eval-when-compile (* 1024 1024 1024))
为most-positive-fixnum
(请这样做,我很确定遇到问题的每个人都会将您的代码复制到他们的配置中)。
@ Hi-Angel我认为这不是一个好主意。如果Emacs实际上分配大量内存而没有变得空闲,则应使用gc而不是继续分配,直到系统必须交换甚至完全用尽内存为止。如果有的话,1GB已经太高了。
—
Erik
gc-cons-threshold
在任何给定的时间设置高于您愿意实际达到的值,因为您应该假设自己会不时地达到该值(毕竟,谁知道会产生多少垃圾?通过一些意想不到的热情的非空闲任务)。我没有看到使用空闲计时器触发gc的特定问题,但是我认为将非空闲gc的阈值设置为看起来像OTT一样高,我的印象是,该值可能被选择为“高于我“永远需要”,而不是“我愿意使用的最高”。