优化 Emacs 的垃圾搜集行为
Emacs 触发垃圾收集的阀值由 gc-cons-threshold
决定,当 Emacs 自上一次垃圾收集后分配的内存超过该阀值时就会触发新一轮的垃圾收集行为。 然而该阀值默认居然不到 800K,导致 Emacs 频繁地进行垃圾收集。
由于垃圾收集速度很快,我们平时可能对 Emacs 的垃圾收集操作不会有感知,将 garbage-collection-messages
设置为 t
可以在 echoline
中显示 GC 过程,另外,通过查看 gc-elapsed
变量的值我们可以看到 Emacs 花费在 GC 过程所花的时间。
gc-elapsed
35.051446504999994
为了提高 Emacs 性能,一个很自然的想法就是提高 gc-cons-threshold
的阀值,让 Emacs 不要那么频繁地进行垃圾收集。 然而,这里就存在两个问题:
- 什么时候触发垃圾收集比较合适?是否一定要等到超过了阀值才收集?
- 这个阀值设置为多大比较合适?太小了垃圾收集太过频繁,太大了则一旦触发垃圾收集可能导致长时间的卡顿
第一个问题的答案是否,我们完全可以通过 run-with-idle-timer
来让 Emacs 在空闲下来的时候就自动进行垃圾收集:
(defvar k-gc-timer (run-with-idle-timer 15 t 'garbage-collect))
第二个问题,我们可以通过记录每次垃圾收集的时间来进行判断和调整:
(defmacro k-time (&rest body) "Measure and return the time it takes evaluating BODY." `(let ((time (current-time))) ,@body (float-time (time-since time)))) (defvar k-gc-timer (run-with-idle-timer 15 t (lambda () (message "Garbage Collector has run for %.06fsec" (k-time (garbage-collect))))))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: org headline 支持多个时间戳
下一篇: CSS3 那些不为人知的高级属性
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
{{ commentTitle }}