Могу ли я профилировать мой .zshrc / .zshenv? - PullRequest
42 голосов
/ 04 декабря 2010

Кажется, моя оболочка слишком долго не запускается .Есть ли способ профилировать его, чтобы я мог выяснить, что так сильно его тормозит?

Ответы [ 2 ]

46 голосов
/ 04 декабря 2010

Попробуйте добавить это в начале файла:

# 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

и это в конце:

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

И вы должны получить подробный журнал, показывающий epoch_second.nanosecond время выполнения каждой строки. Обратите внимание, что GNU date (и поддержка ОС) должны иметь наносекундный выход.

Edit:

добавил комментарии

Редактировать 2:

Если у вас zsh 4.3.12 или новее, вы можете установить PS4, например, вместо использования команды date:

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

, который должен работать как в Linux, так и в OS X, чтобы дать вам наносекундную точность.

2 голосов
/ 12 июня 2015

Вы можете запустить таймер в первой подозрительной точке вашего ~/.zshrc (или в начале):

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

Это предупреждает меня, если когда-либо я вижу слишком медленный запуск, и я оставляю его как постоянную оболочку.

Для более сложных измерений есть zsh-модуль с именем zprof. Это так же просто, как временно обернуть содержимое ваших ~/.zshrc в zmodload zsh/zprof и zprof. Это выведет некоторые подробные таблицы профилирования, которые достаточно легко интерпретировать.

Больше информации на zshmodules(1) manpage.

Когда я нахожу вещи, которые работают особенно медленно (rbenv init, vcs_info проверка изменений, antigen, nvm, zsh-mime-setup, проверка версии интерпретатора и т. Д.), Я добавляю SLOW комментарии в качестве напоминаний и попробуйте найти обходные пути. Медленные стартапы могут вызвать много горя, поэтому я стараюсь избегать zsh пакетов / фреймворков, внутреннюю работу которых я не использую. compinit - самая медленная вещь, с которой я готов жить, и составляет ~ половину всего времени запуска.

...