Oh My Zsh ajoute une surcharge inutile
(rushter.com)- Oh My Zsh (OMZ) reste largement recommandé, mais entraîne une surcharge de scripts inutile qui ralentit le démarrage du shell
- OMZ étant écrit en scripts shell, tous les scripts doivent être interprétés à chaque ouverture d’un nouvel onglet de terminal, ce qui provoque environ 0,38 seconde de latence même avec la configuration par défaut
- Avec une configuration minimale de Zsh, le prompt Starship et une recherche dans l’historique basée sur
fzf, il est possible de ramener le temps de démarrage à 0,07 seconde - Starship construit le prompt à partir d’un binaire unique, remplaçant ainsi les plugins git, environnement virtuel et spécifiques aux langages habituellement fournis par OMZ
- Plutôt que des plugins complexes, une configuration de shell allégée où l’on ajoute soi-même uniquement les fonctions nécessaires est plus efficace
Problèmes de performances d’Oh My Zsh
- Oh My Zsh (OMZ) reste très utilisé, mais sa surcharge inutile (bloat) dégrade la vitesse de démarrage du shell
- OMZ est composé de scripts shell, qui doivent tous être interprétés à chaque ouverture d’un nouvel onglet de terminal
- Avec une configuration incluant les plugins de base (
git,zsh-autosuggestions,zsh-autocomplete), l’exécution de/usr/bin/time -f "%e seconds" zsh -i -c exitprend 0,38 seconde
- Ouvrir un nouvel onglet dans un dossier de dépôt git entraîne une latence ressentie d’environ 1 seconde
- OMZ vérifie périodiquement les mises à jour, ce qui peut ajouter plusieurs secondes de latence
- Mettre à jour fréquemment sa configuration shell est inutile ; il est recommandé d’opter pour une configuration simple où l’on ajoute directement uniquement ce dont on a besoin
Configuration minimale de Zsh
- La configuration minimale de Zsh proposée est la suivante
export HISTSIZE=1000000000 export SAVEHIST=$HISTSIZE setopt EXTENDED_HISTORY setopt autocd autoload -U compinit; compinitHISTSIZEetSAVEHISTdéfinissent la taille de l’historique des commandesEXTENDED_HISTORYajoute un horodatage à l’historiqueautocdpermet de changer de répertoire sans utiliser la commandecdcompinitinitialise le système d’autocomplétion
- Cette configuration suffit déjà à fournir un environnement shell de base avec complétion
Personnalisation du prompt
- Le prompt utilise Starship
- Starship est un prompt rapide et minimaliste constitué d’un seul binaire
- Il remplace les plugins et thèmes d’OMZ existants, tout en affichant l’état de git, des environnements virtuels et des langages
- Dans l’exemple de configuration Starship, les indications liées au cloud comme AWS, GCP, Azure, NodeJS, etc. sont désactivées afin de réduire le bruit visuel
- Dans les projets Python et Rust, le langage concerné est mis en avant dans le prompt, et le temps d’exécution des commandes est également affiché
- Il suffit d’ajouter cette ligne dans
.zshrcpour l’activereval "$(starship init zsh)"
Recherche dans l’historique
- Le plugin
zsh-autosuggestions, souvent utilisé, peut distraire l’attention en affichant des suggestions pendant la saisie - À la place, il est proposé d’associer fzf à
Ctrl+Rpour parcourir l’historique avec une recherche fuzzy interactivesource <(fzf --zsh)
Résultats en matière de performances
- Après application de cette configuration, le temps de démarrage du shell devient
❯ /usr/bin/time -f "%e seconds" zsh -i -c exit 0.07 seconds - Soit un démarrage plus de 5 fois plus rapide que sous OMZ
Astuce supplémentaire
- Les utilisateurs de Vim peuvent activer le mode Vim dans Zsh pour accélérer l’édition des commandes
set -o vi bindkey -v '^?' backward-delete-charzleutilise par défaut les raccourcis clavier d’Emacs ; ce réglage permet donc une saisie de type Vim
Conclusion et cas d’usage
- Après avoir quitté OMZ, l’auteur s’est adapté au nouveau workflow en quelques jours
- Les plugins nécessaires peuvent être chargés manuellement
- S’il ouvre de nombreux onglets, c’est parce qu’il utilise tmux et un éditeur en terminal (helix) ensemble
- Dans tmux, il lance
lazygitet le gestionnaire de fichiersyazisous forme de popups - Il utilise aussi des volets temporaires pour exécuter du code et afficher les sorties de test, chacun fonctionnant comme une session shell distincte
- Dans tmux, il lance
Résumé des commentaires
- Certains utilisateurs affirment que le temps de démarrage d’OMZ, autour de 0,03 seconde, est déjà largement suffisant
- L’auteur souligne que le plugin
zsh-autocompletedégrade les performances - Dans les résultats de
zsh-bench, le délai jusqu’au premier prompt est mesuré à 603 ms pour OMZ, contre 103 ms pour une simple configuration Zsh - Starship remplace les fonctionnalités de prompt d’OMZ avec un seul outil
- D’autres utilisateurs citent comme alternatives Zimfw, Atuin ou encore un prompt bash écrit à la main
10 commentaires
Je n’avais pas encore trouvé ça assez gênant pour que ce soit vraiment perceptible.
Ce n’est pas un serveur web, et tant que ça ne va pas au point d’être gênant, je laisse passer..
Typique des développeurs : ils font tout un cirque pour quelques ms qui ne servent à rien, lol.
J’ai commencé avec omz, donc je pensais que cette gêne faisait simplement partie du lot, snif snif.
Récemment, j’ai retiré les plugins un par un et j’ai aussi modifié la politique de mise à jour… mais en voyant ça, je me dis qu’on peut très bien s’en passer.
Moi, quand je charge la configuration avec tmuxinator, je n’aime pas trop voir apparaître le prompt de mise à jour omz avec y/n.
Je suis passé à prezto il y a quelques mois, et ça m’a fait me demander si omz était vraiment aussi lent.
Rien qu’avec quelques plugins de base, ça devenait nettement plus lent...
Je suis passé à starship.
N’est-ce pas justement pour quelques millisecondes inutiles que la technologie progresse ?
Si vous utilisez souvent le terminal, la latence supplémentaire ajoutée par omz est franchement désagréable.
Commentaires sur Hacker News
Je n’ai qu’une seule raison d’utiliser oh-my-zsh
obtenir un environnement shell immédiatement productif que je peux utiliser tout de suite sur une nouvelle machine, un hôte distant ou un conteneur
plutôt que de passer des heures à bricoler la configuration, je préfère consacrer ce temps à des choses plus importantes
on garde l’expérience « prêt à l’emploi après installation », mais sans plus de 200 ms de latence sur le prompt
l’installation se fait avec une simple ligne de
curl, et la configuration est simpleà mon avis, vous ne le regretterez pas
une fois les fichiers de configuration créés et versionnés avec git, on peut les réutiliser tels quels sur d’autres machines
moi aussi, quand je configure une nouvelle machine, il me suffit de récupérer mes dotfiles pour retrouver immédiatement mon environnement habituel
c’est une blague, mais copier un
.bashrcest bien plus simple que d’installer un shell complet par défautdevoir attendre à chaque ouverture d’onglet m’agaçait
j’ai finalement installé moi-même quelques plugins nécessaires avec Homebrew, et ça m’a pris moins d’une heure
maintenant, j’ai un shell rapide et léger, et je suis bien plus productif et à l’aise
le démarrage du shell est très rapide et la mise en place est facile
C’est pour ça que je suis passé à fish
ce n’est pas parfaitement à mon goût, mais la configuration par défaut est suffisamment bonne pour que je m’y sois simplement habitué
maintenant, je n’ai presque plus à me soucier de la configuration du shell
en revanche, je recommande aux débutants de bien lire les raccourcis clavier
un collègue d’équipe ne connaissait pas les complétions avec tab ou des fonctions comme shift+arrow, et cela l’a déjà ralenti
moi, j’ajoute parfois seulement des bindings vim ou un plugin de fuzzy find
fish de base est déjà largement excellent
Je ne suis pas d’accord avec l’idée de recommander d’activer le mode Vim dans Zsh
le readline par défaut est déjà largement suffisant pour une commande simple
pour les longues commandes, on peut les éditer avec
C-x C-een pair programming, le changement de mode de Vim donne au contraire l’impression de ralentir
C-x C-eest vraiment utileje reste la plupart du temps en mode insertion, et je n’utilise
C-x C-eque quand une modification importante est nécessairesi on est habitué aux bindings vi, des commandes comme
w,b,dwsont plus rapides par mémoire musculaireouvrir l’éditeur casse le flux et masque aussi la sortie, donc je préfère éviter
j’aimerais que le shell propose aussi des fonctions de Vim comme la suppression entre caractères (
di")Moi aussi, je n’utilise oh-my-zsh que comme base de configuration
je n’utilise qu’un plugin git, et mes fonctions personnalisées sont chargées automatiquement
mesuré avec
hyperfine, le shell de connexion prenait 54 ms et le shell normal environ 6 msje pense que les 380 ms de latence peuvent venir d’autre chose
le démarrage immédiat est possible, et le fait que le projet soit en mode maintenance évite au contraire de perdre du temps
zsh -lest un shell de connexion, donc il ne charge paszshrcil faut tester avec
zsh -ic exitpour plus de détails, voir le guide zsh-bench
zprofà.zshrcextract,z,fzfJe suis passé à la combinaison fish + starship
fish fournit nativement l’autocomplétion et la coloration syntaxique, ce qui remplace les fonctions principales d’oh-my-zsh
voir cet article
c’est pourquoi je conserve zsh+starship+un simple script d’initialisation
j’aimerais que fish fonctionne parfaitement « tout simplement », mais il lui manque encore quelque chose
l’absence de HEREDOC et l’impossibilité de faire des blocs en arrière-plan sont gênantes,
mais aujourd’hui je préfère souvent les langages compilés en binaire unique pour remplacer les scripts complexes
quand ce sera plus stable, je pense passer à nushell
Je suis passé à Zim il y a quelques années
il a toutes les fonctions dont j’ai besoin, et il est rapide et simple à installer
https://zimfw.sh/
il prend en charge diverses sources et divers formats, et l’intégration du code zsh est excellente
en matière de vitesse et de compatibilité, c’est bien meilleur que la plupart des systèmes de plugins
c’est vraiment un framework remarquable
J’ai installé oh-my-zsh à l’université, il y a environ 15 ans,
et depuis, j’en suis tellement satisfait que je n’ai jamais ressenti le besoin d’essayer un autre shell ou une autre configuration
c’est la première chose que j’installe à chaque fois que je configure un nouvel ordinateur
J’utilisais oh-my-zsh depuis longtemps, mais cette fois je l’ai supprimé en 5 minutes avec l’aide de Claude
j’ai remplacé uniquement les fonctions dont j’avais besoin par du raw zsh
comme j’utilise
starshippour le prompt, je n’ai presque pas eu besoin de configuration supplémentairejusqu’ici, tout semble fonctionner correctement
Certaines personnes trouvent exagéré de considérer comme un problème les 0,5 seconde de latence d’oh-my-zsh
elles disent qu’utiliser simplement bash et KDE konsole suffit largement
pour elles, le shell n’est qu’un simple wrapper de travail, et il n’y a pas lieu de s’inquiéter de ce genre de micro-optimisations
chaque shell fait partie du flux de travail, donc même une seconde de latence se ressent
c’est pourquoi je pense qu’un shell rapide est important
au maximum une vingtaine, et dans ce cas ce ne serait pas un gros problème
c’est bien d’avoir de bonnes performances, mais selon elle ce n’est pas un problème fondamental
Ma configuration zsh fait environ 90 lignes et n’utilise que 3 plugins (compinit, vcs-info, edit-command-line)
le temps total de démarrage à fermeture est d’environ 0,32 seconde
dans les gros dépôts, il y a une latence liée à la récupération des informations de branche
l’utilitaire de cache bkt (https://github.com/dimo414/bkt) permet de résoudre ce problème
Starship semble probablement utiliser une stratégie de cache similaire
Sans optimisation, c’est vraiment lent. Mais je me suis habitué à beaucoup de ses fonctionnalités, donc ce n’est pas si facile de le quitter...