zsh 与 zinit 启动时间测试方法
本文适合想定位 zsh 启动慢、或想验证 zinit 延迟加载效果的用户。你会学到:用 time zsh -i -c exit 测总耗时、用 zprof 找慢点、对 zinit 插件与 nvm/compinit 做对照实验的科学排查流程。
目标只有一件事:先测量,再定位,再做对照实验。
参考文章:
一、什么时候用
适合这些情况:
- 打开终端明显变慢
~/.zshrc越来越大,不确定慢点在哪- 使用了
zinit,想判断哪些插件该延迟加载 - 想验证
nvm、compinit、主题或补全是否拖慢启动
二、先测总启动时间
先拿基线:
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高的函数- 调用次数异常多的函数
- 插件、补全、版本管理器相关函数
常见慢点:
nvmcompinitcompaudit- 主题初始化
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. 优先查高概率慢点
通常先看:
nvmpyenvrbenvcondacompinit- 提示符主题
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 次:
结论:
- 最主要慢点:
- 有效优化项:
- 无明显收益项:
十、总结
最实用的排查流程就是:
- 用
time zsh -i -c exit测总耗时 - 用
zprof找主要慢点 - 对
zinit插件、nvm、补全系统逐项做对照实验 - 保留记录,只接受能证明有效的修改
通常查到最后,问题都集中在版本管理器、补全系统、主题和少数同步加载插件上。
验证与自查
- 优化前后各跑 5 次
time zsh -i -c exit,取中位数对比,收益可量化 zprof输出的前几名与预期慢点(nvm/compinit/主题)一致- 延迟加载改动后,
zinit times确认非关键插件在启动后异步加载 - 功能无损:补全、提示符、插件在交互使用中表现正常