zsh 与 zinit 启动时间测试方法

本文适合想定位 zsh 启动慢、或想验证 zinit 延迟加载效果的用户。你会学到:用 time zsh -i -c exit 测总耗时、用 zprof 找慢点、对 zinit 插件与 nvm/compinit 做对照实验的科学排查流程。

目标只有一件事:先测量,再定位,再做对照实验。

参考文章:

一、什么时候用

适合这些情况:

  • 打开终端明显变慢
  • ~/.zshrc 越来越大,不确定慢点在哪
  • 使用了 zinit,想判断哪些插件该延迟加载
  • 想验证 nvmcompinit、主题或补全是否拖慢启动

二、先测总启动时间

先拿基线:

time zsh -i -c exit
  • -i:交互式启动
  • -c exit:启动后立即退出,只测初始化

不要只跑一次,建议连续测试:

for i in {1..10}; do
  time zsh -i -c exit
done

记录三件事:

  • 平均耗时
  • 最快和最慢
  • 修改前后的变化

三、保留一份基线记录

可以直接记成这样:

测试时间:2026-04-03
机器环境:本机 / VPS / WSL
zsh 版本:zsh --version
插件管理器:zinit
测试命令:time zsh -i -c exit

优化前:
- 第 1 次:0.92s
- 第 2 次:0.88s
- 第 3 次:0.95s

优化后:
- 第 1 次:0.41s
- 第 2 次:0.39s
- 第 3 次:0.43s

不要只写"感觉快了"。

四、用 zprof 找慢点

~/.zshrc 顶部加入:

zmodload zsh/zprof

在末尾加入:

zprof

然后执行:

zsh -i -c exit

重点看:

  • self 高的函数
  • total 高的函数
  • 调用次数异常多的函数
  • 插件、补全、版本管理器相关函数

常见慢点:

  • nvm
  • compinit
  • compaudit
  • 主题初始化
  • zinit 加载的补全插件
  • 各类 eval "$(xxx init zsh)"

五、zinit 的对照测试

不要一次性重写配置,直接做对照实验。

原始配置例如:

zinit light zsh-users/zsh-autosuggestions
zinit light zsh-users/zsh-completions
zinit light Aloxaf/fzf-tab
zinit light zsh-users/zsh-syntax-highlighting

改成延迟加载再测:

zinit ice wait lucid
zinit light zsh-users/zsh-autosuggestions

zinit ice wait lucid
zinit light zsh-users/zsh-completions

然后重新执行:

time zsh -i -c exit

比较三件事:

  • 同步加载耗时
  • wait 后是否明显下降
  • 是否影响实际使用

六、推荐排查顺序

1. 测原始配置

for i in {1..5}; do
  time zsh -i -c exit
done

2. 打开 zprof

先找最慢的前几个对象。

3. 优先查高概率慢点

通常先看:

  • nvm
  • pyenv
  • rbenv
  • conda
  • compinit
  • 提示符主题
  • zinit 中的大插件或补全插件

4. 每次只改一类

不要同时改多个变量,否则很难判断因果关系。

5. 每改一次就重测

time zsh -i -c exit

必要时再跑一次 zprof

七、专项测试

nvm

保留原配置先测,再临时注释下面这类内容重测:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

如果差距明显,说明 nvm 是主要慢点之一。常见处理方式:

  • 改成按需加载
  • 进入 Node 项目目录时再加载
  • 换成更轻的工具,例如 fnm

compinit

典型写法:

autoload -Uz compinit
compinit

保留原配置测一轮,再临时注释后重测:

time zsh -i -c exit

如果差距明显,再考虑:

  • 精简补全插件
  • 避免重复初始化
  • 优化补全缓存
  • 把部分补全插件改成延迟加载

八、准备最小化配置做对照

复杂配置里来回删改容易混乱,建议单独建测试目录:

mkdir -p ~/zsh-benchmark
cp ~/.zshrc ~/zsh-benchmark/.zshrc

也可以先换成最小配置:

# ~/zsh-benchmark/.zshrc
autoload -Uz compinit
compinit

用独立环境测试:

ZDOTDIR="$HOME/zsh-benchmark" zsh -i -c exit

这样不会污染主配置。

九、记录模板

# zsh 启动时间测试记录

日期:
系统:
终端:
zsh 版本:
插件管理器:

原始配置:
- 第 1 次:
- 第 2 次:
- 第 3 次:

zprof 重点耗时:
- 
- 
- 

第一次修改:
- 修改内容:
- 第 1 次:
- 第 2 次:
- 第 3 次:

第二次修改:
- 修改内容:
- 第 1 次:
- 第 2 次:
- 第 3 次:

结论:
- 最主要慢点:
- 有效优化项:
- 无明显收益项:

十、总结

最实用的排查流程就是:

  1. time zsh -i -c exit 测总耗时
  2. zprof 找主要慢点
  3. zinit 插件、nvm、补全系统逐项做对照实验
  4. 保留记录,只接受能证明有效的修改

通常查到最后,问题都集中在版本管理器、补全系统、主题和少数同步加载插件上。

验证与自查

  1. 优化前后各跑 5 次 time zsh -i -c exit,取中位数对比,收益可量化
  2. zprof 输出的前几名与预期慢点(nvm/compinit/主题)一致
  3. 延迟加载改动后,zinit times 确认非关键插件在启动后异步加载
  4. 功能无损:补全、提示符、插件在交互使用中表现正常

参考