优化配置时,如何处理 (package-initalize) ?

最近调试配置的时候发现这个 (package-initalize) 很耗时间 这是我的配置

(require 'package)
(setq package-archives
      '(("melpa-cn" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
        ("org-cn"   . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")
        ("gnu-cn"   . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
	("gnu"      . "http://elpa.gnu.org/packages/")))


(package-initialize)

发现把 gnu 的地址拿掉会加快不少,想问问大家都是怎么处理 (package-initalize) 的,
通常怎么优化这个配置,可不可以不加载这个啊?

可以,你不是加了gnu-cn了吗?

initialize 应该不会特别慢,它只是读 content 然后写入内存。你说把 gnu 拿掉快,问题应该是出在 refresh 上。比如说你如果每次对应的 contents 文件在关闭时都会删掉,那每次都要 refresh 拉一次就会读网络比较慢。或是你配置里显示调用了 refresh。

如果你不用 package 来管理包就不用这个,比如说自己把所有要的包下载到哪里然后手动加 load-path。或者用 nix 这种工具,把插件部分导进同一个目录内,这样只需要一个 load-path 就行了。

27以后是可以不用调 package-initialize 了

https://github.com/emacs-mirror/emacs/blob/3af9e84ff59811734dcbb5d55e04e1fdb7051e77/etc/NEWS.27#L184

package-initialize 花费时间还是挺多的,用 esup 测试过,大概会花 0.2s 在它上面。而且正是因为 archive-contents 文件太大,而 elisp 执行速度慢,综合下来就会使得这部分可以被明显地观察到。

find ~/.emacs.d -name 'archive-contents' -exec wc -l {} \;

# 5046 /home/condy/.emacs.d/elpa/archives/melpa/archive-contents
# 3060 /home/condy/.emacs.d/elpa/archives/gnu/archive-contents
# 834 /home/condy/.emacs.d/elpa/archives/nongnu/archive-contents

在我这里只使用了 melpa, gnu 和 nongnu 的情况下就已经接近 9k 行了。

是可以不调用,因为 package-initialize 主要做了两件事情

  1. 加载 (activate) 本地已下载的包
  2. 读取 archive-contents

而第 2 点通常不是那么重要。

1 个赞

用straight,不需要配置package.el,没有package-initialize 的烦恼,所有包又能统一通过git下载,比较省事。