在 Windows 的开发人员驱动器 (Dev Drive) 中安装 Emacs「続」

破案了。

这不是 Windows defender 的锅(也难怪改 Windows Defender 一点效果都没有),而是智能应用控制: Windows 安全中心 应用中的应用 & 浏览器控件Smart App Control

打开 SAC 评估模式之后 Windows 会检查应用,判断没问题再放行,所以第一次就很慢。如果还要加载 eln 文件那就是极其的慢。

在重新使用 --with-native-compilation=aot 编译 Emacs 并重启系统尝试打开 Emacs 后,启动时间正常了:

总算是能在 Windows 11 下愉快地使用带 native-comp 的 Emacs 了。我之前也用过一段时间的 Win11 但没遇到这个问题,可能是因为先前的 Win11 版本还没有引入这个功能,而且这个功能只能在 新安装 的 Win11 系统上才能开启,而且一旦手动关闭就无法打开了。

(P.S. Re: Speeding up loading when load-path has many packages 也许能进一步改善 Emacs 启动速度.)

5 个赞

用如下几招优化Spacemacs/Emacs-30.1速度,在windows中基本流畅:

353 packages loaded in 1.529s (e:266 r:19 l:5 b:63)

2 个赞

还真是… 立竿见影的提升。

(setq load-suffixes '(".elc" ".el"))
(setq load-file-rep-suffixes '(""))

有时间爬爬邮件去。

native-comp的话是不是还要加上 ".eln" ?

原版就没有。

eln 的加载机制不太一样,虽然我还没详细了解

刚刚试了下, load-file-rep-suffixes最好在启动后重新设置为默认值,要不然help buffer 里面文件连接打不开.el.gz文件

编译加 --without-compress-install 就不会压缩了,不过默认编译这个变量确实最好不要改。

这个问题(user目录初始化),我之前的解法是直接mklink /J <new_user> <exists_user>(在home下,第一次在新环境打开msys2窗口前),主要是当时我需要在双系统(win)下使用msys2环境 (,目前使用下来暂时没遇到其他问题,就是如果再次复制移动可能得重新设置下(如果跨硬盘?)。

相当于把已存在的用户目录软链接到 msys64 的 home 下面吗。

对的,差不多是这样,

1 个赞

启动完成后记得恢复load-suffixes,否则无法加载外部.dll的动态文件。

据说能提升 Emacs 运行速度的配置项

;; Emacs 中有一个根据文件名在 IO 操作中插入自定义处理的机制(Magic File Name)。该机制主要用于无缝访问远程文件等场景,但在启动过程中几乎不会需要用到。然而即使不使用该功能,系统仍会进行文件名检查,因此在加载包等操作时会产生额外开销。

(let ((my-saved-file-name-handler-alist file-name-handler-alist))
  (setq file-name-handler-alist nil)
  (add-hook 'elpaca-after-init-hook
            (lambda ()
              (setq file-name-handler-alist my-saved-file-name-handler-alist))))
2 个赞

楼上的 @sunlin7 这段时间在 Emacs 两大邮件列表上有不少关于 Windows 上 优化启动速度的讨论,闲的时候可以看看 25 年四五月的相关讨论。

有时间 我很想整理一下发个新帖子。

2 个赞

Emacs 31 已经合并了关于提高启动速度的修改。具体使用可以看 NEWS 中介绍:

我这边测试下来,在 Windows 上启动时间上提升了 0.2s(0.8 → 0.6, 总共 70个包)

1 个赞

差不多,我这里是 3.0s 到 2.7s,减少了 0.3s。

包加载时间应该还是 Emacs 启动时间的大头,但我也不清楚这对路径查找的优化时间的幅度是多少,毕竟很难测路径查找用时。

p.s. 最近的一些 commit 从其他方面减少了 Windows 上的 Emacs 启动用时,启动时间影响因素还是挺杂的…

p.s^2,我使用的配置代码,放在 init.el 的开头:

;;@@ Emacs 31 新特性,缓存 load-path 加快加载速度,大约提升 15%
(when (boundp 'load-path-filter-function)
  (setq load-path-filter-function #'load-path-filter-cache-directory-files))
1 个赞