Oh My Zsh fügt unnötigen Overhead hinzu
(rushter.com)- Oh My Zsh (OMZ) wird weiterhin häufig empfohlen, verursacht aber unnötigen Skript-Overhead, der die Startzeit der Shell verlangsamt
- OMZ ist in Shell-Skripten geschrieben, sodass beim Öffnen jedes neuen Terminal-Tabs alle Skripte erneut interpretiert werden müssen; selbst mit der Standardkonfiguration entsteht dabei eine Verzögerung von etwa 0,38 Sekunden
- Mit einer einfachen minimalen Zsh-Konfiguration, dem Starship-Prompt und einer fzf-basierten Verlaufssuche lässt sich die Startzeit auf 0,07 Sekunden verkürzen
- Starship erstellt den Prompt als einzelnes Binary und ersetzt damit die bisherigen git-, virtuelle-Umgebung- und sprachspezifischen Plugins von OMZ
- Statt komplexer Plugins ist eine verschlankte Shell-Konfiguration, bei der nur die benötigten Funktionen direkt hinzugefügt werden, effizienter
Performance-Probleme von Oh My Zsh
- Oh My Zsh (OMZ) ist weiterhin weit verbreitet, verlangsamt aber durch unnötigen Ballast (bloat) die Startgeschwindigkeit der Shell
- OMZ besteht aus Shell-Skripten, die beim Öffnen jedes neuen Terminal-Tabs vollständig interpretiert werden müssen
- In einer Konfiguration mit den Standard-Plugins
git,zsh-autosuggestionsundzsh-autocompleteergab die Ausführung von/usr/bin/time -f "%e seconds" zsh -i -c exit0,38 Sekunden
- Wird ein neuer Tab in einem git-Repository geöffnet, entsteht subjektiv eine Verzögerung von etwa 1 Sekunde
- OMZ prüft regelmäßig auf Updates, was mehrere zusätzliche Sekunden Verzögerung verursachen kann
- Häufige Updates der Shell-Konfiguration sind unnötig; empfohlen wird eine einfache Konfiguration, in die nur die tatsächlich benötigten Funktionen direkt aufgenommen werden
Minimale Zsh-Konfiguration
- Die vorgeschlagene minimale Zsh-Konfiguration sieht wie folgt aus
export HISTSIZE=1000000000 export SAVEHIST=$HISTSIZE setopt EXTENDED_HISTORY setopt autocd autoload -U compinit; compinitHISTSIZEundSAVEHISTlegen die Größe des Befehlsverlaufs festEXTENDED_HISTORYfügt dem Verlauf Zeitstempel hinzuautocderlaubt den Verzeichniswechsel ohne den Befehlcdcompinitinitialisiert das Autovervollständigungssystem
- Schon diese Konfiguration bietet eine grundlegende Shell-Umgebung mit Vervollständigung
Anpassung des Prompts
- Für den Prompt wird Starship verwendet
- Starship ist ein schneller, minimalistischer Prompt in Form eines einzelnen Binarys
- Es ersetzt die bisherigen Plugins und Themes von OMZ und zeigt git-, virtuelle-Umgebung- und sprachspezifische Statusinformationen an
- Im Beispiel für die Starship-Konfiguration werden cloudbezogene Anzeigen wie AWS, GCP, Azure und NodeJS deaktiviert, um visuelles Rauschen zu reduzieren
- In Python- und Rust-Projekten wird die jeweilige Sprache im Prompt hervorgehoben; außerdem wird die Laufzeit von Befehlen angezeigt
- Aktivierung durch Hinzufügen dieser einen Zeile in
.zshrceval "$(starship init zsh)"
Verlaufssuche
- Das häufig verwendete Plugin
zsh-autosuggestionszeigt Vorschläge während der Eingabe an und kann dadurch ablenkend wirken - Stattdessen wird fzf an
Ctrl+Rgebunden, um den Verlauf per interaktiver Fuzzy-Suche zu durchsuchensource <(fzf --zsh)
Ergebnis der Performance-Verbesserung
- Nach Anwendung der obigen Konfiguration ergibt sich für die Shell-Startzeit
❯ /usr/bin/time -f "%e seconds" zsh -i -c exit 0.07 seconds - Damit ist die Startgeschwindigkeit im Vergleich zu OMZ mehr als fünfmal höher
Zusätzliche Tipps
- Vim-Nutzer können in Zsh den Vim-Modus aktivieren, um die Bearbeitung von Befehlen zu beschleunigen
set -o vi bindkey -v '^?' backward-delete-charzleverwendet standardmäßig Emacs-Keybindings; mit dieser Einstellung wird die Eingabe im Vim-Stil unterstützt
Fazit und Einsatzszenarien
- Nach dem Wechsel von OMZ erfolgte die Anpassung an den neuen Workflow innerhalb weniger Tage
- Benötigte Plugins können direkt manuell geladen werden
- Der Grund für das Öffnen vieler Tabs ist die gemeinsame Nutzung von tmux und einem terminalbasierten Editor (helix)
- In tmux werden
lazygitund der Dateimanageryazials Pop-ups ausgeführt - Für Code-Ausführung und Testausgaben werden temporäre Splits verwendet, die jeweils als eigene Shell-Sitzung laufen
- In tmux werden
Zusammenfassung der Kommentare
- Einige Nutzer behaupten, die Startzeit von OMZ liege mit 0,03 Sekunden bereits in einem ausreichend schnellen Bereich
- Der Autor weist darauf hin, dass das Plugin zsh-autocomplete die Geschwindigkeit verringert
- In Ergebnissen von
zsh-benchwurde für OMZ eine Verzögerung bis zum ersten Prompt von 603 ms gemessen, für eine einfache Zsh-Konfiguration 103 ms - Starship ersetzt die promptbezogenen Funktionen von OMZ durch ein einzelnes Werkzeug
- Andere Nutzer erwähnen Alternativen wie Zimfw, Atuin und selbst geschriebene bash-Prompts
10 Kommentare
Typisch Entwickler: Wegen ein paar unnötigen Millisekunden machen sie gleich so ein Riesendrama, haha.
Entwickelt sich die Technik nicht gerade wegen dieser unnötigen paar ms weiter?
Ich habe mit omz angefangen und dachte, das wäre einfach eine Unannehmlichkeit, die man in Kauf nehmen muss seufz
In letzter Zeit habe ich die Plugins nach und nach entfernt und auch die Update-Richtlinie geändert ... wenn ich das sehe, denke ich mir, dass es auch ganz ohne geht.
Wenn ich mit tmuxinator die Konfiguration lade und dann die omz-Update-Abfrage y/n auftaucht, finde ich das eher nervig.
Ich bin vor ein paar Monaten zu prezto gewechselt und dachte mir dabei schon, ob omz wirklich so langsam war.
Schon mit nur ein paar grundlegenden Plugins wird es deutlich langsamer...
Ich bin auf starship umgestiegen.
Wenn du das Terminal häufig verwendest, ist die zusätzliche Verzögerung durch omz ziemlich unangenehm.
Hacker-News-Kommentare
Ich habe genau einen Grund, oh-my-zsh zu verwenden
Ich will auf einer neuen Maschine, einem Remote-Host oder in einem Container sofort eine direkt produktive Shell-Umgebung haben
Statt Stunden damit zu verbringen, die Konfiguration selbst anzupassen, investiere ich diese Zeit lieber in wichtigere Dinge
Das bietet weiterhin die Erfahrung „installieren und sofort nutzen“, aber ohne Prompt-Latenz von über 200 ms
Die Installation geht mit einer einzigen
curl-Zeile, und die Konfiguration ist ebenfalls einfachIch denke, du wirst es nicht bereuen, es ausprobiert zu haben
Hat man die Konfigurationsdateien einmal erstellt und per git verwaltet, kann man sie auf anderen Maschinen unverändert weiterverwenden
Wenn ich eine neue Maschine einrichte, muss ich auch nur meine dotfiles holen, und meine gewohnte Umgebung läuft sofort
Nur halb im Scherz, aber das Kopieren einer
.bashrcist deutlich einfacher als die Installation einer kompletten Standard-Shell-KonfigurationEs war nervig, bei jedem neuen Tab warten zu müssen
Am Ende habe ich nur ein paar benötigte Plugins direkt über Homebrew installiert, und das hat nicht einmal eine Stunde gedauert
Jetzt habe ich eine schnelle, schlanke Shell und bin deutlich produktiver und zufriedener
Der Shell-Start ist sehr schnell, und das Setup ist unkompliziert
Deshalb bin ich zu fish gewechselt
Es ist nicht perfekt auf meinen Geschmack zugeschnitten, aber die Standardeinstellungen sind gut genug, dass ich mich einfach daran gewöhnt habe
Inzwischen muss ich mir um die Shell-Konfiguration fast keine Gedanken mehr machen
Anfänger sollten sich allerdings unbedingt die Keybindings ansehen
Bei einem Teamkollegen wurde die Arbeit langsamer, weil er Funktionen wie Tab-Completion oder shift+arrow nicht kannte
Ich füge gelegentlich nur Vim-Bindings oder ein Fuzzy-Find-Plugin hinzu
Schon das Standard-fish ist wirklich hervorragend
Ich stimme nicht der Meinung zu, dass man in Zsh unbedingt den Vim-Modus aktivieren sollte
Das normale readline ist für einzelne Befehle völlig ausreichend
Längere Befehle kann man mit
C-x C-ebearbeitenBeim Pair Programming wirkt die Umschaltung in den Vim-Modus auf mich eher langsamer
C-x C-ewirklich istDie meiste Zeit bin ich im Insert-Modus, und nur für größere Bearbeitungen nutze ich
C-x C-eWenn man an vi-Keybindings gewöhnt ist, sind Befehle wie
w,b,dwdurch Muscle Memory schnellerEinen Editor zu öffnen unterbricht den Flow und verdeckt außerdem die Ausgabe, deshalb mag ich das nicht
Ich wünschte, die Shell hätte auch Funktionen aus Vim wie Löschen zwischen Zeichen (di")
Ich nutze oh-my-zsh auch nur als Grundgerüst
Ich verwende nur das git-Plugin und lade benutzerdefinierte Funktionen automatisch
Mit
hyperfinegemessen lag die Login-Shell bei 54 ms und eine normale Shell bei etwa 6 msIch denke, die Verzögerung von 380 ms könnte auch andere Ursachen haben
Sofortiger Start ist möglich, und der Wartungsmodus verhindert eher, dass man Zeit verschwendet
zsh -list eine Login-Shell und lädtzshrcnichtMan sollte mit
zsh -ic exittestenDetails dazu stehen im zsh-bench-Leitfaden
zprofin.zshrceinzufügenextract,z,fzfauszuprobierenIch bin auf die Kombination fish + starship umgestiegen
fish bietet standardmäßig Autovervollständigung und Syntax-Highlighting und ersetzt damit die wichtigsten Funktionen von oh-my-zsh
Siehe auch diesen Beitrag
Deshalb bleibe ich bei zsh + starship + einem einfachen Init-Skript
Ich wünschte, fish würde vollständig „einfach funktionieren“, aber ganz so weit ist es noch nicht
Dass es kein HEREDOC gibt und keine Background-Blöcke möglich sind, ist unpraktisch,
aber heutzutage bevorzuge ich für komplexe Skripte eher Sprachen, die zu einem einzelnen Binary gebaut werden
Wenn es ausgereifter ist, will ich zu nushell wechseln
Ich bin vor ein paar Jahren zu Zim gewechselt
Es hat alles, was ich brauche, und ist schnell und einfach zu installieren
https://zimfw.sh/
Es unterstützt verschiedene Quellen und Formate, und auch die Integration von zsh-Code ist hervorragend
In Geschwindigkeit und Kompatibilität ist es den meisten Plugin-Systemen deutlich überlegen
Wirklich ein großartiges Framework
Ich habe oh-my-zsh vor etwa 15 Jahren im Studium installiert,
und seitdem war ich so zufrieden damit, dass ich nie das Bedürfnis hatte, andere Shells oder Konfigurationen auszuprobieren
Bei jedem neuen Rechner ist es das Erste, was ich installiere
Ich habe oh-my-zsh lange verwendet, aber diesmal mit Claude in fünf Minuten entfernt
Ich habe nur die Funktionen, die ich wirklich brauche, durch raw zsh ersetzt
Da ich
starshipals Prompt nutze, brauchte ich kaum zusätzliche KonfigurationBisher scheint alles problemlos zu funktionieren
Manche finden es übertrieben, sich über die 0,5 Sekunden Verzögerung von oh-my-zsh zu beschweren
Ihrer Meinung nach reicht es völlig, einfach bash und KDE konsole zu verwenden
Die Shell sei nur ein einfacher Wrapper für die Arbeit, und man müsse sich um solche Mikrooptimierungen nicht kümmern
Jede Shell ist Teil des Arbeitsflusses, daher fällt selbst eine Verzögerung von 1 Sekunde spürbar ins Gewicht
Deshalb halte ich eine schnelle Shell für wichtig
Selbst wenn es 20-mal wäre, sei das kein großes Problem
Natürlich ist bessere Performance schön, aber es sei kein grundlegendes Problem
Meine zsh-Konfiguration ist etwa 90 Zeilen lang und verwendet nur drei Plugins (compinit, vcs-info, edit-command-line)
Vom Start bis zum Ende dauert es ungefähr 0,32 Sekunden
In großen Repositories gibt es Verzögerungen, weil Branch-Informationen abgefragt werden
Mit dem bkt-Caching-Utility (https://github.com/dimo414/bkt) lässt sich dieses Problem lösen
Wahrscheinlich nutzt Starship ein ähnliches Caching-Verfahren
Wenn man es nicht optimiert, ist es wirklich langsam. Aber ich habe mich an viele der Funktionen so gewöhnt, dass es nicht gerade leicht ist, davon wegzukommen.
Bisher fühlte es sich noch nicht so störend an, dass es wirklich auffallen würde.
Es ist ja kein Webserver; solange es nicht so unbequem ist, dass es wirklich stört, nehme ich es einfach hin..