Back

Warum zsh langsam startet (und wie man es behebt)

Warum zsh langsam startet (und wie man es behebt)

Sie öffnen einen neuen Terminal-Tab. Sie warten. Eine Sekunde vergeht, dann zwei, vielleicht drei. Ihr zsh-Prompt erscheint endlich. Diese frustrierende Verzögerung ist nicht die Schuld der Shell – es liegt fast immer an Ihrer Konfiguration.

Eine Vanilla-zsh-Installation startet in etwa 50–100 Millisekunden. Wenn die Startzeit auf mehrere Sekunden anwächst, sind die Übeltäter vorhersehbar: Overhead des Completion-Systems, synchrones Laden von Plugins, ressourcenintensive Themes und Sprachversions-Manager wie nvm oder pyenv. Dieser Leitfaden zeigt Ihnen, wie Sie herausfinden, was tatsächlich langsam ist, und es beheben, ohne Ihr gesamtes Setup neu zu schreiben.

Wichtigste Erkenntnisse

  • Eine Standard-zsh startet in 50–100ms. Verzögerungen von mehreren Sekunden stammen aus Ihrer .zshrc, nicht von der Shell selbst.
  • Verwenden Sie zsh/zprof und /usr/bin/time zsh -i -c exit, um die tatsächlichen Engpässe zu identifizieren, bevor Sie etwas ändern.
  • Sprachversions-Manager (nvm, pyenv, conda) sind die häufigsten Übeltäter – laden Sie diese verzögert (lazy-load) für sofortige Verbesserungen.
  • Rufen Sie compinit genau einmal auf, reduzieren Sie ungenutzte Plugins und verwenden Sie ein leichtgewichtiges Theme, um zusätzliche Startzeit einzusparen.

Profiling vor Optimierung

Raten verschwendet Zeit. Zsh enthält einen eingebauten Profiler, der genau zeigt, wohin Ihre Startzeit geht.

Fügen Sie dies in die erste Zeile Ihrer ~/.zshrc ein:

zmodload zsh/zprof

Fügen Sie dies in die letzte Zeile ein:

zprof

Öffnen Sie ein neues Terminal. Sie sehen eine Ausgabe wie diese:

num  calls    time           self           name
1)   1        442.05  84.53%  254.54  48.68%  nvm_auto
2)   2        187.51  35.86%   91.66  17.53%  nvm
3)   1         75.70  14.48%   64.37  12.31%  nvm_ensure_version_installed

Die Spalte self zeigt die Zeit, die in jeder Funktion verbracht wurde, ohne Aufrufe anderer profilierter Funktionen. Konzentrieren Sie sich zuerst auf die größten Werte.

Für die Wanduhr-Messung verwenden Sie:

/usr/bin/time zsh -i -c exit

Führen Sie dies mehrmals aus – der erste Aufruf kann Cold-Cache-Effekte beinhalten.

Die häufigsten Engpässe

Sprachversions-Manager (nvm, pyenv, conda)

Diese sind die mit Abstand häufigste Ursache für langsame zsh-Starts. Allein die Standard-nvm-Initialisierung kann 300–500ms hinzufügen.

Die Lösung: Lazy Loading. Initialisieren Sie diese Tools nicht, bis Sie sie tatsächlich aufrufen.

Für nvm ersetzen Sie den Standard-Initialisierungsblock durch:

export NVM_DIR="$HOME/.nvm"

nvm() {
  unfunction nvm
  [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
  nvm "$@"
}

Die Verwendung einer Wrapper-Funktion anstelle eines Alias ist hier robuster. Ein Alias-basierter Ansatz kann fehlschlagen, wenn nvm indirekt aufgerufen wird (zum Beispiel durch ein Skript oder eine andere Funktion), da Aliase nur in interaktiven Top-Level-Befehlspositionen expandiert werden. Eine Funktion hingegen verhält sich in jedem Kontext wie ein echter Befehl.

Wenn Sie Oh-My-Zsh verwenden, aktivieren Sie das nvm-Plugin mit Lazy Loading:

zstyle ':omz:plugins:nvm' lazy yes
plugins=(git nvm)

Dieser Ansatz reduzierte die Startzeit eines Benutzers von 430ms auf 140ms – eine Verbesserung von 70%.

compinit wird mehrfach aufgerufen

Die Funktion compinit initialisiert das Completion-System von zsh. Sie ist ressourcenintensiv, und Frameworks rufen sie oft versehentlich mehrfach auf.

Best Practice: Rufen Sie compinit genau einmal auf, nachdem alle $fpath-Modifikationen abgeschlossen sind.

# ZUERST zum fpath hinzufügen
fpath=($ZSH_CUSTOM/plugins/zsh-completions/src $fpath)

# DANN Completions initialisieren
autoload -Uz compinit && compinit

Wenn Ihre .zcompdump-Datei veraltet oder beschädigt ist, regenerieren Sie sie:

rm -f ~/.zcompdump
compinit

Die Verwendung von compinit -C überspringt Sicherheitsprüfungen und ist schneller, aber verstehen Sie den Trade-off, bevor Sie es aktivieren: Es warnt Sie nicht, wenn eine Completion-Datei manipuliert wurde oder einem anderen Benutzer gehört.

Zu viele Plugins

Jedes Plugin lädt Dateien synchron während des Starts. Überprüfen Sie Ihre Plugin-Liste gnadenlos.

Kontrollieren Sie, welche Plugins Sie tatsächlich verwenden. Die Plugins github und brew sind notorisch langsam. Entfernen Sie alles, was Sie nicht wöchentlich nutzen.

Ressourcenintensive Themes

Komplexe Themes, die den Git-Status abfragen, Netzwerkressourcen prüfen oder Subprozesse ausführen, fügen spürbare Latenz hinzu.

Wenn Sie Powerlevel9k verwenden, wechseln Sie zu Powerlevel10k. Es ist ein Drop-in-Ersatz, der Prompts 10–100x schneller rendert. Aktivieren Sie dessen Instant-Prompt-Feature für gefühlt sofortigen Start.

Oh-My-Zsh Auto-Update-Prüfungen

Die Update-Prüfung von Oh-My-Zsh läuft bei jedem Shell-Start und kann die Startzeit dominieren. Deaktivieren Sie sie:

DISABLE_AUTO_UPDATE="true"

Sie können omz update weiterhin manuell ausführen, wann immer Sie möchten.

Schnelle Erfolge für schnelleren Start

  1. Reduzieren Sie die Plugin-Anzahl – Entfernen Sie ungenutzte Plugins aus Ihrer Konfiguration.
  2. Lazy-Loading für Versions-Manager – nvm, pyenv und conda sollten bei Bedarf geladen werden.
  3. Rufen Sie compinit einmal auf – Nachdem alle fpath-Modifikationen abgeschlossen sind.
  4. Verwenden Sie ein leichtgewichtiges Theme – Oder aktivieren Sie Powerlevel10ks Instant Prompt.
  5. Deaktivieren Sie Auto-Updates – Prüfen Sie Updates stattdessen manuell.

Wie „schnell” tatsächlich aussieht

Eine gut optimierte zsh-Konfiguration mit Oh-My-Zsh sollte in 150–300ms starten. Ohne Framework sind 50–100ms erreichbar. Wenn Sie über 500ms liegen, ist etwas Spezifisches falsch – und zprof zeigt Ihnen, was.

Fazit

Optimieren Sie nicht blind. Profilen Sie Ihren Start, identifizieren Sie die echten Engpässe und wenden Sie gezielte Korrekturen an. Die meisten Entwickler können ihre zsh-Startzeit in unter zehn Minuten um 50–80% reduzieren, indem sie einen Versions-Manager mit Lazy Loading versehen und ein paar ungenutzte Plugins entfernen.

Denken Sie daran, die zprof-Zeilen aus Ihrer .zshrc zu entfernen, wenn Sie mit dem Messen fertig sind.

Häufig gestellte Fragen (FAQs)

Nein. Eine nackte zsh-Installation startet genauso schnell wie bash, typischerweise in unter 100 Millisekunden. Die wahrgenommene Langsamkeit kommt fast immer davon, was Ihre .zshrc beim Start lädt, wie Plugins, Themes und Versions-Manager, nicht von der Shell selbst.

In der Praxis nicht. Lazy Loading bedeutet, dass nvm und seine verwaltete Node-Version beim ersten Aufruf von nvm, node, npm oder npx in einer Sitzung geladen werden. Nach diesem ersten Aufruf funktioniert alles genau wie zuvor. Der einzige Unterschied ist, dass die Shell schneller startet.

Führen Sie zsh mit aktiviertem Profiling aus, indem Sie zmodload zsh/zprof am Anfang und zprof am Ende Ihrer .zshrc hinzufügen. Suchen Sie in der Ausgabe nach mehrfachen Aufrufen neben compinit oder compdump. Wenn die Spalte calls eine Zahl größer als eins zeigt, initialisiert Ihre Konfiguration Completions redundant.

Nicht unbedingt. Oh-My-Zsh selbst fügt moderaten Overhead hinzu. Die Verlangsamungen kommen von spezifischen Plugins und Themes, die darüber geladen werden. Das Kürzen Ihrer Plugin-Liste, Lazy Loading von Versions-Managern und der Wechsel zu einem schnellen Theme wie Powerlevel10k bringen die Startzeit normalerweise unter 300 Millisekunden, ohne das Framework aufzugeben.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay