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

关闭了,感觉性能没有明显提升,但耗电量变得巨大

:smile: 估计是经常更新包,触发了编译。我日常挂着电源,倒是没注意耗电量。

用的doom,开了native-compilation以后,发现启动速度没啥变化,于是就关了。

我们说的性能提升不是说启动速度。

好像 native-comp 的作者提到过,开 native-comp 后启动速度不变或者慢点都是正常的。至于主要是哪方面提升较大,还请知道的大佬来解释下。我只知道在 json 的解析方面有提升,所以对 LSP 有帮助。

我觉得我们作为用户可以从使用的整体流畅性上感受 native-comp 是否有性能提升。

不想在电脑上装 gcc(MacBook),没开。

1 个赞

我本来是开了的,但是在论坛看到有人对比过几乎没什么影响,就又关了。目前好像确实是没有什么影响,几乎感觉不到速度有变化。而且也没有很多warning了。

个人感受,打开native-comp启动会稍稍慢一些,29以后性能影响并不大,可能是因为Emacs内部本身做了很多优化。反而,28中开启性能感受要明显些,尤其是在做lsp补全跳转之类的操作时。

目前LSP慢的原因主要是数据量太大,native那点加速根本就不够,而且上千候选词带来的GC问题,native也解决不了。

1 个赞

主要是基于 byte-compiler 的结果优化掉一些写得质量不高的代码里明显的 nop,另外就是基于类型推导做一些更激进的 inline,去掉一些不必要的安全檢查。

用来做算术,和大量用 vector string 之类的基本数据类型的可能会快些,如果多少要做些 IPC 和大量的 object,那基本没什么提升。

again, 猫哥也说了 Emacs GC 着实拉跨,目前来说也不是没有开发者意识到这问题,只是历史代码着实难改。

2 个赞

环境:m1的macbook,emacs29 开了后启动要慢0.2秒,日常使用没有明显变化,而且怎么改eln-cache的路径最终都会在user-emacs-directory下创建个文件夹看着很烦,就关掉了hhh

哈哈,我也是这个理由

还可以提供个“有的电脑上开,有的电脑上不开”

从最早开始只有linux支持,到把它折腾到windows上。原来在windows和macOS上都用native-comp,后来经常从源码编译,用native-comp的话,每次都要重新编译,非常麻烦,而且速度上提升不明显。现在都不用native-comp了。

默认开启,js2-mode需要用lisp做大量计算.我用javascript,所以必须要用它.性能还是有提升的.

也许对lisp计算任务比较繁重的插件有用 (swiper, pyim, evil, …)

负面因素对我影响很少,

  • 我很少需要自己编译emacs
  • 我使用包的策略是stable melpa优先, 目前用的包也很稳定,所以很少需要编译新安装的包
4 个赞

这个路径可以改到任何你想要的路径。

你可以在 $HOME/.emacs.d/early-init.el 文件中通过下面的代码修改:

(when (boundp 'native-comp-eln-load-path)
  (setcar native-comp-eln-load-path
          (expand-file-name "~/.cache/eln-cache/")))

这里用了 setcar 是为了只修改 native-comp-eln-load-path 的第一个元素的值。第二个元素的路径是内置包 .eln 的存放位置,不需要改。

这个我有试过的, 还试过另一个代码:

  (setq native-comp-cache-dir (expand-file-name (expand-file-name ".local/cache/eln/" user-emacs-directory) comp-native-version-dir))
  (setcar native-comp-eln-load-path native-comp-cache-dir)
  (startup-redirect-eln-cache native-comp-cache-dir)
  (setq native-compile-target-directory native-comp-cache-dir)

但是因为有些自带的包或者第三方包的编译是make-process然后用make进行编译的, 这个变量有时候会莫名失效, 比如

  1. borg的编译还需要修改borg.mk.
  2. magit编译的时候总会编译几个内置的包放到user-emacs-directory 下的eln-cache. 研究了半天magit改了改makefile后也算差不多解决了.
  3. 折腾了一阵后最终不会在eln-cache/version 下创建编译文件了, 但是总会在不晓得什么时候创建一个空的eln-cache文件夹.

最终跟这个文件夹战斗了几周, 最终在没有明显性能提升下放弃了native-comp :joy:

用 Borg 的话,还要在 .emacs.d/etc/borg/config.mk 或者 etc/borg/config.el 设置下。

但我还是让 eln-cache 放 .emacs.d 下,加入 .gitignore 就好了。

这也是我想放弃 native-comp 的主要原因。最近用 Emacs-29,更新比较频繁。

请教一下,这个变量native-comp-deferred-compilation我没有改动,值是t,但是编译过的elc文件似乎并不会自动触发编译eln,可能是什么原因导致的呢?

之前没什么时间折腾emacs,我记得上次用28.x的时候是会自动触发的,这几天重新装了个29.0.6 (m1 macos emacs-plus@29的版本)再试就遇到这个问题。

gcc之类的配置理论上应该是没问题,因为有看到几个貌似是emacs内置的elisp触发了编译生成了eln,而且如果手动直接async编译的命令是可以正常生成eln的。

主要放弃的原因还是在我的电脑上性能无法感知即使日常用eglot写golang, 不然的话即使烦人还是会用的hhh