--with-native-compilation=aot
这个特性自从 Emacs 28.1 开始合并到 Emacs 中, 开始也叫 native-comp。据说开启后可以获得明显的性能提升,特别是对使用 LSP 的用户。想了解更多,可以参考 EmacsWiki:Gcc Emacs
开启这个特性带来的正面影响:
- 获得明显的性能提升,特别是对使用 LSP(比如用 eglot,lsp-mode 等) 的用户帮助更加明显。
开启这个特性带来的负面影响:
-
编译 Emacs 的时间显著增加
比如在 macOS 编译 emacs-29 不开 native-comp 只要 5分钟,开启后要 15 分钟。
在 Windows 10 编译 emacs-29 不开 native-comp 只要 10 分钟,开启后要 25 分钟
当然,不同性能的机器,时间也会不一样,这个时间数值只是一个参考。
对于喜欢编译 Emacs master 的用户尤其不友好。
-
更新第三方包时又要重新编译 .elc
为 .eln
,给用户的体验就是卡,以及弹出一堆 warning 提示(当然可以通过设置关闭提示)
-
软件包大小明显变大,不过在大磁盘时代,这个无所谓。
其他方面的正/负面影响欢迎补充。
做个投票:大家都开启了 native-comp 了吗?
- 开启了 native-compilaiton
- 关闭了 native-compilation
- 还在使用老版本的 Emacs,没有 native-comp 特性
开启了aot,平时安装第三方包并不会实时编译。
(setq native-comp-deferred-compilation nil)
5 个赞
我倒是没设置过这个变量,这个也算是个折中的方案,这样第三方包还是用 byte-compilation。解决了上面的第2点问题。
对。尤其是包开发者,更新包后老是native-comp吃不消,卡得要死。这个方案算是两者兼顾吧,内置的包都用native-comp,第三方用byte-comp。缺点是编译时间长点。
打算用下这个方案。
对于编译 Emacs 时间长的问题,看来只能通过降低编译 Emacs 的频率来缓解,或者等 emacs-29 发布后直接用正式版本来解决(只编译1次)。
我目前是关闭了这个功能,准备等 emacs 30 发布的时候再使用,那时候估计 warn 就解决的差不多了,现在老是弹窗感觉很烦人
另外投票说明,正面和负面的信息最好都说一下,只提负面消息有带节奏的嫌疑。
2 个赞
多谢提醒。
正面的影响在开头就说明了,提升性能,特别是对 LSP 有帮助。大佬还有要补充的吗?
已经更新到首页。
@seagle0128 提到的 (setq native-comp-deferred-compilation nil)
选项应该可以解决这你这个烦恼。
顺便提醒下,在目前最新的 Emacs 29.0.60 中,这个变量废弃了,用 inhibit-automatic-native-compilation
替代。 设置 inhibit-automatic-native-compilation
为 t
也是同样的效果。
只要在 early-init.el 中加入下面的设置:
(setq inhibit-automatic-native-compilation t)
1 个赞
关闭了,因为完全体会不到 native-comp 有带来可感知的性能提升
5 个赞
同感,但是不开又感觉亏了
你如果用 elgot 或者 lsp-mode 写代码也许能感知性能的提升。
可以利用免费的 GitHub Action 自己每天预编译一下,用的时候只需要下载下来就好了
2 个赞
我以前在 macOS 用 Nix 的时候就是用的这个方案(编译好上传到 Cachix)。
现在不用 Nix了,而且要照顾 Windows 平台,所以还是用自己的编译脚本本地编译。
GHA 有免费的 MacOS / Linux / Windows 环境啊
回头有空再试试 Github Action,不知道配置安装依赖方便吗(比如 sqlite3 和 tree-sitter )?
有如何配置 MacOS / Linux / Windows 环境的说明链接吗?
都挺方便的,Market 上有很多现成的 actions。
1 个赞
为了兼容性暂时还是用native-comp-deferred-compilation
。
有一台电脑的Manjaro Linux中用了native-compile的Emacs。
其它若干台都用的无此特性的旧版Emacs。