43 votes

Puis-je profiler mon .zshrc/.zshenv ?

On dirait que ma coquille prend chemin trop long à démarrer. Y a-t-il un moyen de le profiler pour savoir ce qui le ralentit autant ?

47voto

Dennis Williamson Points 105818

Essayez d'ajouter ceci au début du fichier :

# set the trace prompt to include seconds, nanoseconds, script name and line number
# This is GNU date syntax; by default Macs ship with the BSD date program, which isn't compatible
PS4='+$(date "+%s:%N") %N:%i> '
# save file stderr to file descriptor 3 and redirect stderr (including trace 
# output) to a file with the script's PID as an extension
exec 3>&2 2>/tmp/startlog.$$
# set options to turn on tracing and expansion of commands contained in the prompt
setopt xtrace prompt_subst

et ceci à la fin :

# turn off tracing
unsetopt xtrace
# restore stderr to the value saved in FD 3
exec 2>&3 3>&-

Vous devriez obtenir un journal détaillé indiquant l'heure d'exécution de chaque ligne (epoch_second.nanosecond). Notez que GNU date (et le support du système d'exploitation) est nécessaire pour avoir une sortie nanoseconde.

Editar:

commentaires ajoutés

Edit 2 :

Si vous disposez de zsh 4.3.12 ou d'une version plus récente, vous devriez être en mesure de configurer PS4 comme ceci au lieu d'utiliser le date commandement :

zmodload zsh/datetime
setopt promptsubst
PS4='+$EPOCHREALTIME %N:%i> '

qui devrait fonctionner à la fois sur Linux et OS X pour vous donner une précision à la nanoseconde.

0 votes

J'ai ajouté un espace très important à ce que j'ai posté initialement.

1 votes

Veillez à setopt prompt_subst également - sinon l $(date ..) ne sera pas remplacée.

0 votes

Pourriez-vous ajouter quelques notes supplémentaires sur ce que chaque ligne ci-dessus fait exactement ?

2voto

Micah Elliott Points 11

Vous pouvez commencer votre minuterie au premier point suspect de votre ~/.zshrc (ou au début) :

integer t0=$(date '+%s')  # move this around
... maybe something suspect ...

# End of zshrc
function {
    local -i t1 startup
    t1=$(date '+%s')
    startup=$(( t1 - t0 ))
    [[ $startup -gt 1 ]] && print "Hmm, poor shell startup time: $startup"
}
unset t0

Cela m'alerte si jamais je vois un démarrage trop lent, et je le laisse comme un emballage permanent.

Pour des mesures plus sophistiquées, il existe un module zsh appelé zprof . C'est aussi simple que d'envelopper temporairement le contenu de vos ~/.zshrc dans un zmodload zsh/zprof y zprof . Cela va générer des tableaux de profilage verbeux qui sont assez faciles à interpréter.

Plus d'informations dans zshmodules(1) page de manuel.

Lorsque je trouve des choses qui sont particulièrement lentes (rbenv init, vcs_info check-for-changes, antigen, nvm, zsh-mime-setup, vérification de la version de l'interpréteur, etc) je ajouter SLOW des commentaires comme rappels et essayer de trouver des solutions de contournement. Les démarrages lents peuvent causer beaucoup d'ennuis, donc j'ai tendance à éviter les paquets/mots-clés zsh dont je ne connais pas le fonctionnement interne. compinit est la chose la plus lente avec laquelle je suis prêt à vivre et représente environ la moitié du temps total de démarrage.

1voto

Josh H Points 115

Zsh possède un module de profilage. Au début de ~/.zshrc o ~/.zshenv ajoutez-le comme ça :

# Uncomment to use the profiling module
# zmodload zsh/zprof

Décommentez-le, démarrez un nouveau shell interactif puis exécutez la commande zprof . Vous obtiendrez une liste détaillée d'éléments que vous pourrez passer en revue pour mieux comprendre où se trouvent les goulets d'étranglement de vos performances :

num  calls                time                       self            name
-----------------------------------------------------------------------------------
 1)    1           7.29     7.29   19.60%      7.29     7.29   19.60%  _p9k_init_ssh
 2)    2           6.72     3.36   18.06%      6.63     3.31   17.81%  gitstatus_start_impl
 3)    1           4.00     4.00   10.75%      4.00     4.00   10.75%  _p9k_must_init
 4)    3          19.28     6.43   51.80%      3.82     1.27   10.28%  (anon)
 5)    1           1.63     1.63    4.37%      1.63     1.63    4.37%  _p9k_restore_state_impl
 6)    1          16.92    16.92   45.46%      1.61     1.61    4.32%  _p9k_precmd_impl
 7)    1           7.13     7.13   19.16%      0.87     0.87    2.33%  _p9k_set_prompt
 8)   22           6.26     0.28   16.83%      0.84     0.04    2.27%  _p9k_build_segment
 9)   17           0.82     0.05    2.19%      0.82     0.05    2.19%  _p9k_param
10)    6           2.24     0.37    6.02%      0.74     0.12    1.98%  _p9k_left_prompt_segment
11)    5           0.59     0.12    1.60%      0.59     0.12    1.60%  add-zsh-hook
12)    1           3.05     3.05    8.20%      0.58     0.58    1.56%  prompt_dir

Et voici une phrase tirée de Accélération de zsh vous apprécierez si l'heure de départ est sporadique :

for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done

Exécutez ce travail et vous devriez voir un résultat comme :

        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys
        0.05 real         0.02 user         0.02 sys

Profit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X