用 `dump-emacs` 极大加快 Emacs 启动速度

https://www.emacswiki.org/emacs/DumpingEmacs

Common Lisp 实现一般都有个叫做 dump 的功能,就是把当前内存写入到一个编译后的 Lisp 文件,然后再次启动时只要加载 dump 文件就能快速启动了。

没想到 Emacs 也有这个功能。

只推荐配置已经基本稳定且一般只使用终端版本的用户使用。

3 个赞

这属于黑科技。。。

Lisp 基本都是黑科技。

据说兼容性不佳,新的操作系统有一个安全功能,会让应用程序每次运行时内存地址空间随机,导致emacs的这个功能失效,目前还没有最终解决方案

Dump 应该不会受这种影响。 Emacs 以及 Common Lisp 实现等本身是一个 Dump 出来的镜像,只要能 Dump 出来就不会有因为内存地址变化无法加载。Emacs 镜像是在编译时 Dump 的,也就是说如果 随机内存地址能影响 dump 的话,甚至连 Emacs 都编译不出来。

Reddit 上有人说 118 MB 的镜像缓存完成后启动时间不到 1 秒。也有声称一万行以上的配置 dump 出来 0.5 秒就能启动。

的确有几个问题:Spacemacs 这种大量使用延迟加载的配置不能直接 dump。不过你可以选择只 dump 比较稳定的核心,剩下的正常加载。不必一有变化就重新 dump ,完全可以累积一下。 以及有可能出现 dump 出来的 Emacs 不支持某些特性。

你说的这样逐步累积形式的dump要怎么做?这个我觉得很有可行性。 用elisp写的话,该如何?

dump的意思就是把当前lisp虚拟机的状态保存起来,下次启动直接恢复到保存的状态。 如果你要dump的话,就不要用任何延迟加载技术,直接把所有需要的库都require/load进来,然后dump。 理论上讲,启动一个dump过的Emacs和启动一个没有dump的Emacs然后加载所有库以后的状态应该是完全等价的。 实际上正常编译Emacs的过程就经过了这个dump步骤。make首先编译出一个最小的Emacs,叫做temacs,只包含C语言的核心,没有任何lisp,然后用temacs加载作者认为正常Emacs默认需要的lisp库,把加载完的状态dump出来,变成一个新的可执行文件,就是你平时用的Emacs。

5 个赞

as in the link, start emacs from batch mode, load all el files and exec dump-emacs. However it doesn’t work well with GUI (all kinds of) akaik.

可以参考 spacemacs 的 moon branch

想到 dump 的另一个用途:除错

通常,出错提问的时侯都要求写重现步骤/脚本,如果这个步骤比较复杂,或者别人照做也重现不了。简单粗暴的办法就是把当前状态 dump 下来,发给对方。

1 个赞

然而目前 Emacs 只能在 batch 脚本模式下 dump image,不见得比重现脚本方便。

是的,只能在batch下真是蛋疼。干嘛不像Common Lisp那样直接dump session呢?