查找问题

添加zmodload zsh/zprof到zsh读取的第一个配置文件最上方,一般是zshrc。然后跑zprof就可能看到详细的加载时间了。然后分析吧。

然后可以使用time zsh -i -c exit;来测试总时间。

主要原因

主要引起加载慢的原因有几点。

compinit,特别是oh-my-zsh,很多插件会反复使用此指令,从而导致运行效率低下,而prezpto则相对好一点。但对于bashcompinit是需要自己执行的。

thefuck等使用命令后eval的,首先这类工具已经相对成熟,不会存在经常变更的情况,所以我们可以把这部分生成需要eval的生成到文件内,然后直接source,而不是每次启动去调用一遍。

ssh-agentgpg-agent等。特别是ssh-agent,在macOS,如果要使用keychain(此指macOS内置的钥匙串),写ssh-add -K会非常消耗时间,其实这个指令是不用每次执行的,只要每次系统更新后跑一下就行了,然后在config里加上UseKeychain yes就行了。而至于agent可以使用keychain来管理(funtoo子项目),会比直接跑来得方便,但是消耗时间会比较大,而prezpto的gpg就模块比较好用。同时再用gpg去管理ssh-agent,简直完美。

插件管理工具,推荐使用antigen,之前笔者用过zplug,太慢了!静太加载似乎是需要人工设置的。而antigen会自动处理静态加载。只有每次修改后的第一次加载会比较慢。

结果

经过一大部分优化,从oh-my-zsh7s+优化到使用antigen prezpto1.2s,最后至0.5s。如果把keychain取消,只需要0.2s呢!只要不觉得慢就可以了。

不过fish的速度还是要优于zsh呢。应该是整个过程中还是存在可以优化的问题呢。不过不太想搞了。google查到一个人,fork了一个oh-my-zsh,优化不要的插件和compinit,启动时间仅要0.2s左右,也是相当出色呢。