zsh 启动非常慢

Eli*_*Eli 77 mac zsh oh-my-zsh

ZSH 从创建一个新的终端窗口到准备好大约需要一秒钟半的时间。我很确定罪魁祸首是compinit.

我一直没能找到好的文档,compinit,但看起来它应该在一些文件中缓存所有必要的东西,比如.zcompdump.

有什么加速的技巧吗?

小智 37

oh-my-zsh在我的笔记本电脑上启动大约需要 1.5 秒。 我写了一些我采取的步骤,以将其缩短到大约 0.25 秒

另一个好心人总结了将我的更改集成到您的 oh-my-zsh副本所需的步骤

最大的问题是compinit在 fpath 完全定义后被调用了一大堆额外的时间,而不是仅仅一次。我在我的oh-my-zshgithub分支上进行了这些更改。这些更改已在 github 上进行了讨论,它们似乎对一些人运行良好。希望这些更改将oh-my-zsh在不久的将来合并。

  • 对于未来的读者,我相信所有这些更改现在都已合并到上游。 (5认同)
  • 更改可能已移至上游,但从插件中删除 Git 对我有很大帮助。 (2认同)
  • 我有最新版本的 oh-my-zsh,没有任何变化,需要 20 秒才能启动。 (2认同)

kyl*_*iss 31

虽然 ZSH 有自己公平的减速份额,但如果您在看到该Last Login:行之前发现终端窗口有一段时间是空白的,则您将需要清除日志文件以查看速度改进。从 OSX Lion 开始,这仍然是一个问题,需要每隔几个月进行一次。跛脚,我知道。

命令是:

sudo rm -rf /private/var/log/asl/*.asl
Run Code Online (Sandbox Code Playgroud)

当然,需要事先阅读这篇文章,这样你才能确切地知道发生了什么,因为运行任何所说的都sudo rm需要考虑。我把它放在这里只是因为你使用 ZSH 证明你有能力使用命令行启动。

  • 我建议不要使用`-r`,因为不涉及目录,也不需要它。如果有人错误地输入`sudo rm -rf / private/var/log/asl*.asl`(私有前的空格),省略它会导致更少的眼泪。 (11认同)
  • 或者更万无一失,`cd /private/var/log/asl` 然后是 `rm -f *.asl`。同样作为记录,这个答案使我免于接近 10 秒的启动时间,非常感谢! (2认同)
  • 为我工作!顺便说一句`垃圾/private/var/log/asl*.asl`。当然,需要安装`trash`。`酿造安装垃圾` (2认同)

xer*_*r0x 13

我最大的改进来自从 plugin=() 部分中删除项目。'github' 和 'brew' 插件加载速度很慢。

我还删除了别名为的集线器,这git也加快了提示速度。

我一直在使用 '/usr/bin/time zsh -i -c exit' 来记录启动时间,但是compinit对我来说似乎没有太大的不同。

很高兴听到其他人正在做些什么来加快速度。


小智 8

你是用预装的/bin/zsh还是其他的?我问,因为我通过 fink 安装的 zsh 由于包含zsh 模板而启动非常慢,而 vanilla 会立即启动。

使用显式转储文件 ( compinit -d dumpfile)运行会使其运行得更快吗?手册页指出

下一次调用 compinit 将读取转储文件而不是执行完全初始化。

  • 我正在使用 Oh My Zsh(我相信它使用默认的 /bin/zsh)。当我禁用加载所有 Oh My Zsh 的插件和诸如此类的东西时,它加载得非常快,但我认为在这种情况下永远不会调用 `compinit`。当我手动调用 `compinit` 时,它需要一点时间。也许只是因为 Oh My Zsh 为 compinit 添加了这么多绑定? (2认同)

Art*_*rov 6

现在 oh-my-zsh 在查询状态之前检查特殊的 git 配置选项 oh-my-zsh.hide-status。所以运行

git 配置 oh-my-zsh.hide-status 1

在有问题的存储库上。


Ste*_* Lu 6

Zsh 本身在 0.1 秒内启动,对我来说已经足够了。我刚刚注意到,当我接近 50,000 个命令历史记录标记时,加载第一个提示变得更像是 3 秒。

我不知道你们是如何找到所有这些导致启动缓慢的其他原因的,但我的猜测正是我的第一个猜测。我做了一个mv ~/.zsh_history zsh_history_backup和 bam,3 秒启动现在是 0.1 秒启动。奇怪的是,/usr/bin/time /bin/zsh -i -c exit未能捕获加载历史记录所需的时间。

但是,如果您的 zsh 历史记录中没有数以万计的命令,那么这不是它。我~/.zsh_history测量了 1.8MB。很可能不小心将一大块东西作为命令粘贴到终端中,这也会使历史迅速膨胀(尽管这是非常需要避免的事情,因为它显然具有极大的破坏性)。


小智 6

就我而言,NVM 让它变慢了。

原始代码(在 .bash_profile,.zshrc 加载我的 bash_profile)

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
Run Code Online (Sandbox Code Playgroud)

我已将其更改为:

export NVM_DIR="$HOME/.nvm"
#[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
alias nvm="unalias nvm; [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"; nvm $@"
Run Code Online (Sandbox Code Playgroud)

添加了别名(最后一行),所以我只会在尝试使用它时加载 NVM。它将加载时间从 1.5 秒减少到 0.2 秒。

/usr/bin/time zsh -i -c exit #If you want to time yours
Run Code Online (Sandbox Code Playgroud)

  • 我也是如此。值得一提的是,任何其他版本管理器也可能会影响启动时间(jenv、pyenv、rbenv...)。 (2认同)