[投票] 你开启 native-compilation 特性了吗?

--with-native-compilation=aot 这个特性自从 Emacs 28.1 开始合并到 Emacs 中, 开始也叫 native-comp。据说开启后可以获得明显的性能提升,特别是对使用 LSP 的用户。想了解更多,可以参考 EmacsWiki:Gcc Emacs

开启这个特性带来的正面影响:

  1. 获得明显的性能提升,特别是对使用 LSP(比如用 eglot,lsp-mode 等) 的用户帮助更加明显。

开启这个特性带来的负面影响:

  1. 编译 Emacs 的时间显著增加
    比如在 macOS 编译 emacs-29 不开 native-comp 只要 5分钟,开启后要 15 分钟。
    在 Windows 10 编译 emacs-29 不开 native-comp 只要 10 分钟,开启后要 25 分钟
    当然,不同性能的机器,时间也会不一样,这个时间数值只是一个参考。

    对于喜欢编译 Emacs master 的用户尤其不友好。

  2. 更新第三方包时又要重新编译 .elc .eln,给用户的体验就是卡,以及弹出一堆 warning 提示(当然可以通过设置关闭提示)

  3. 软件包大小明显变大,不过在大磁盘时代,这个无所谓。

其他方面的正/负面影响欢迎补充。

做个投票:大家都开启了 native-comp 了吗?

  • 开启了 native-compilaiton
  • 关闭了 native-compilation
  • 还在使用老版本的 Emacs,没有 native-comp 特性

0 投票人

开启了aot,平时安装第三方包并不会实时编译。

(setq native-comp-deferred-compilation nil)
5 个赞

我倒是没设置过这个变量,这个也算是个折中的方案,这样第三方包还是用 byte-compilation。解决了上面的第2点问题。

对。尤其是包开发者,更新包后老是native-comp吃不消,卡得要死。这个方案算是两者兼顾吧,内置的包都用native-comp,第三方用byte-comp。缺点是编译时间长点。

:+1:打算用下这个方案。

对于编译 Emacs 时间长的问题,看来只能通过降低编译 Emacs 的频率来缓解,或者等 emacs-29 发布后直接用正式版本来解决(只编译1次)。

我目前是关闭了这个功能,准备等 emacs 30 发布的时候再使用,那时候估计 warn 就解决的差不多了,现在老是弹窗感觉很烦人

另外投票说明,正面和负面的信息最好都说一下,只提负面消息有带节奏的嫌疑。

2 个赞

多谢提醒。

正面的影响在开头就说明了,提升性能,特别是对 LSP 有帮助。大佬还有要补充的吗?
已经更新到首页。

@seagle0128 提到的 (setq native-comp-deferred-compilation nil) 选项应该可以解决这你这个烦恼。

木有,我 emacs 应用比较简单 :rofl:

顺便提醒下,在目前最新的 Emacs 29.0.60 中,这个变量废弃了,用 inhibit-automatic-native-compilation 替代。 设置 inhibit-automatic-native-compilationt 也是同样的效果。

只要在 early-init.el 中加入下面的设置:

(setq inhibit-automatic-native-compilation t)
1 个赞

关闭了,因为完全体会不到 native-comp 有带来可感知的性能提升

5 个赞

同感,但是不开又感觉亏了 :joy:

你如果用 elgot 或者 lsp-mode 写代码也许能感知性能的提升。

可以利用免费的 GitHub Action 自己每天预编译一下,用的时候只需要下载下来就好了

2 个赞

:+1: 我以前在 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。