2010-12-04 34 views

Répondre

46

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>&- 

Et vous devriez obtenir un journal détaillé indiquant le temps de epoch_second.nanosecond de l'exécution de chaque ligne. Notez que GNU date (et le support OS) est requis pour avoir une sortie de nanosecondes.

Edit:

commentaires ajoutés

Edit 2:

Si vous avez zsh 4.3.12 ou plus tard, vous devriez être en mesure de définir PS4 comme celui-ci au lieu d'utiliser la commande date:

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

qui devrait fonctionner sur Linux et OS X pour vous donner une précision de l'ordre de la nanoseconde.

+0

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

+1

Assurez-vous de 'setopt prompt_subst', sinon la partie' $ (date ..) 'ne sera pas remplacée. – blueyed

+0

Pourriez-vous s'il vous plaît ajouter quelques notes sur ce que chaque ligne ci-dessus fait exactement? –

2

Vous pouvez commencer votre minuterie au premier point suspect dans 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 me avertit si jamais je vois un démarrage trop lent, et je laisse en tant que un emballage permanent.

Pour les mesures plus sophistiquées, il existe un module zsh appelé zprof. C'est aussi simple que d'emballer temporairement le contenu de votre ~/.zshrc dans un zmodload zsh/zprof et zprof. Cela va vider certaines tables de profilage verbeux qui sont assez faciles à interpréter.

Plus d'info dans zshmodules(1) manpage.

Quand je trouve des choses qui sont particulièrement lents (rbenv init, vcs_info check-pour-changements, l'antigène, NVM, zsh-mime-configuration, la vérification de la version de l'interprète, etc.) Je ajouter SLOW commentaires comme des rappels, et essayer pour trouver des solutions de contournement. Les démarrages lents peuvent causer beaucoup de chagrin, donc j'ai tendance à éviter les paquets/cadres de zsh dont je ne gêne 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 de démarrage total.