Hacker News 中文摘要

RSS订阅

加速我的 ZSH Shell -- Speeding up my ZSH shell

文章摘要

作者发现ZSH shell启动速度过慢,每次打开终端需要5秒以上。通过使用ZSH自带的性能分析工具zprof,作者成功定位了导致启动缓慢的原因,并分享了如何使用该工具进行性能分析。

文章总结

加速我的 ZSH Shell ⚡

最近,我进行了一次小型的优化任务,目的是加快我的 ZSH Shell 启动速度。每次打开新终端时,ZSH 的加载时间都超过了 5 秒,虽然这看起来不算太长,但累积起来还是让人感到不便。于是,我决定找出导致速度变慢的原因,并寻找优化方法。

如何分析 ZSH 的启动时间

ZSH 自带了一个非常实用的性能分析工具 zprof。通过在 .zshrc 文件的顶部和底部分别添加以下代码,可以生成详细的启动时间分析报告:

```bash

在 .zshrc 的顶部添加

zmodload zsh/zprof

在 .zshrc 的底部添加

zprof ```

通过分析报告,我发现以下几个主要的性能瓶颈:

  1. Oh-My-Zsh:占用了 55.73% 的启动时间。
  2. compinit(命令补全系统):占用了 30.76% 的启动时间。
  3. 语法高亮:占用了 14.63% 的启动时间。

优化 Oh-My-Zsh

根据 JonLuca 的研究,通过禁用自动更新和魔法函数,可以将 Oh-My-Zsh 的加载时间减少一半。具体操作如下:

```bash

在 .zshrc 的顶部添加

DISABLEAUTOUPDATE="true" DISABLEMAGICFUNCTIONS="true" DISABLE_COMPFIX="true" ```

优化命令补全系统

命令补全系统 compinit 是 ZSH 的内置功能,用于在按下 Tab 键时显示可能的补全选项。通过以下优化,可以减少其加载时间:

```bash

更智能的补全初始化

autoload -Uz compinit if [ "$(date +'%j')" != "$(stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)" ]; then compinit else compinit -C fi ```

优化 Spaceship Prompt

Spaceship Prompt 是一个我非常喜欢的主题,但它也占用了不少资源。通过启用异步加载和仅加载必要的模块,可以显著提高其性能:

```bash SPACESHIPPROMPTASYNC=true SPACESHIPPROMPTADDNEWLINE=true SPACESHIPCHAR_SYMBOL="⚡"

仅加载实际使用的模块

SPACESHIPPROMPTORDER=( time user dir git line_sep char ) ```

插件管理

插件的加载顺序对性能也有影响。以下是我优化后的插件配置:

bash plugins=( git zsh-autosuggestions zsh-syntax-highlighting # 必须放在最后 )

此外,我还为自动建议功能添加了性能优化:

bash ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE="20" ZSH_AUTOSUGGEST_USE_ASYNC=1

优化结果

经过上述优化,我的 ZSH Shell 启动时间从原来的 5 秒缩短到了 0.5 秒,提升了近 10 倍!以下是优化前后的对比:

| 组件 | 优化前 | 优化后 | | --- | --- | --- | | Oh-My-Zsh | 55.73% | ~20% | | 命令补全系统 | 30.76% | ~10% | | 语法高亮 | 14.63% | ~8% | | 总时间 | ~5s | ~0.5s |

其他优化建议

如果你对当前的 ZSH 配置感到满意,并且启动速度已经足够快,那么可以不必进行这些优化。但如果你和我一样,对性能有更高的追求,可以尝试以下替代方案:

  • Pure Prompt:一个比 Spaceship 更快的主题。
  • fast-syntax-highlighting:可能比默认的语法高亮更快。
  • Zinit:一个比 Oh-My-Zsh 更快的插件管理器。

总的来说,这次优化让我对 ZSH 的性能有了更深入的了解,并且显著提升了使用体验。希望这些优化方法对你也有所帮助!

评论总结

评论主要围绕ZSH和Oh-My-ZSH的性能问题展开,提出了多种优化和替代方案。以下是主要观点和论据的总结:

  1. Oh-My-ZSH的臃肿问题

    • 多位用户认为Oh-My-ZSH过于臃肿,导致启动速度变慢。例如,WhyNotHugo表示:“Oh-my-zsh有很多酷炫的功能,但它是一个庞大而复杂的野兽。” (Oh-my-zsh has a lot of cool and handy features, but it is a huge and complex beast.)
    • ivanjermakov指出:“Oh-my-zsh非常臃肿,你可能不需要它,因为它的常用功能可以直接用ZSH实现。” (Oh-my-zsh is very bloated. You might not need it, since its most used features can be implemented with zsh directly.)
  2. 优化Oh-My-ZSH的方法

    • srvmshr通过剥离不必要的部分创建了“leanZSH”,显著提升了性能:“我的修复方法是去掉OhMyZSH中所有我认为不必要的部分。” (My fix was going through OhMyZSH and stripping away all the parts that I felt unnecessary.)
    • rezmason通过懒加载nvm优化了启动速度:“现在我已经重新配置了.zshrc,让nvm懒加载,一切都变得很快。” (Now I've reconfigured .zshrc to lazy-load nvm, and everything's snappy.)
  3. 替代方案

    • 多位用户推荐使用Fish Shell,如stouset表示:“Fish shell with starship。你永远不会回头。” (Fish shell with starship. You will never look back.)
    • Jerry2推荐使用Prezto:“我切换到Prezto,因为它比Oh-My-ZSH快得多。” (I switched to Prezto because I found OMZ too slow.)
  4. ZSH的默认设置问题

    • soraminazuki认为ZSH的默认设置需要改进:“ZSH不需要配置框架或插件,只需要改变默认设置。” (zsh doesn't need configuration frameworks or plugins. All it needs is a change in the default settings.)
    • RGBCube批评ZSH的自动更新机制:“ZSH每次启动时都尝试更新,这太疯狂了。” (From the post, it seems like ZSH tries to update on every shell spawn.)
  5. 其他优化建议

    • gjvc建议从零开始启用插件:“确保你没有启用太多插件,从零开始,按需启用。” (make sure you haven't got too many plugins enabled.)
    • f311a通过精简配置提升了性能:“我的自定义配置现在不到10行。” (My custom config is less than 10 lines now.)

总结:评论中普遍认为Oh-My-ZSH虽然功能强大,但过于臃肿,导致性能问题。用户提出了多种优化方法,如剥离不必要的部分、懒加载插件等,同时也推荐了Fish Shell和Prezto等替代方案。此外,ZSH的默认设置和自动更新机制也受到了批评。