Optimize zsh startup time

最近发现zsh启动越来越慢,最终定位到一个很奇妙的原因。

TLDR: fpath 更新导致 zsh 会重做 compinit 的缓存,从而拖慢启动速度。

因为一些原因,最近在频繁修改一些环境变量,每次在文件里修改完我习惯是在当前终端执行 source ~/.zshrc 来加载最新的配置而不是重新打开一个终端。然鹅这个过程会再次加载 zsh 的所有插件到 fpath 变量中,导致 fpath 里出现了重复的路径。而每次 fpath 变化,zsh 都会认为需要重新生成 compinit 的缓存文件,而你下一次打开一个新的终端时,fpath又恢复正常(也变化了),zsh 就又会重新执行 compinit 的过程。

quote from Mr.GPT

🚨 你的 fpath 被重复注入了同样的目录 4 次以上

解决方法也很简单,就是在加载插件前,先用 typeset -U fpath 来去重 fpath 变量即可。

最终的 ~/.zshrc 相关部分内容如下,展示启动时间耗时的命令 zmodload zsh/zprof / zprof 取消注释就可以看到启动时每个步骤的耗时。

# --- file start

# perf start

# zmodload zsh/zprof



# Disable compinit security check && disable auto update

ZSH_DISABLE_COMPFIX="true"

DISABLE_AUTO_UPDATE="true"



# ....everything else...



typeset -U fpath



plugins=(git virtualenv zsh-autosuggestions zsh-syntax-highlighting)



source $ZSH/oh-my-zsh.sh



# perf end

# zprof

注:compinit 缓存文件在 ~/.zcompdump*,可以手动删除它来强制 zsh 重新生成缓存文件。