Skip to content

Fix and Optimize Slow Zsh Startup

Published:  at 08:20 PM
Table of Contents

Measuring Startup Performance

Before optimizing anything, you need to establish a baseline. Here’s how to measure your current Zsh startup time:

time zsh --interactive -c exit

This command will show you exactly how long it takes for Zsh to start up and immediately exit.

For a more detailed breakdown of what’s slowing down your startup, add profiling to your ~/.zshrc:

# Add this as the FIRST line in your ~/.zshrc
zmodload zsh/zprof

# ... your existing configuration ...

# Add this as the LAST line in your ~/.zshrc
zprof

After adding these lines, open a new terminal session. You’ll see a detailed report showing which functions and processes are consuming the most time during startup.

Common Performance Culprits and Solutions

Node Version Manager (NVM)

The Problem: NVM is notorious for adding 1-3 seconds to Zsh startup time due to its initialization process.

The Solution: Replace NVM with Fast Node Manager (fnm), a Rust-based alternative that’s significantly faster.

Install Fnm

Schniz/fnm: 🚀 Fast and simple Node.js version manager, built in Rust

brew install fnm
# Fast Node Manager (fnm)
# @see https://github.com/Schniz/fnm
eval "$(fnm env --use-on-cd --shell zsh)"

Reference: Fix slow ZSH startup due to NVM

Java Environment Manager (jenv)

In my case, I simply deleted the setting for now. I might need to deal with it later.

Zsh Completion System (compinit)

The Problem: Zsh’s completion system checks for new completions on every startup, which can be slow.

The Solution: Optimize compinit to only rebuild the completion cache once per day:

# Speed up compinit by checking cache only once daily
autoload -Uz compinit
for dump in ~/.zcompdump(N.mh+24); do
  compinit
done
compinit -C

References:

Result

5.2s -> 0.78s

Resources