Подтвердить что ты не робот

Могу ли я профилировать мой .zshrc/.zshenv?

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

4b9b3361

Ответ 1

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

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

Вы можете запустить свой таймер в первой подозрительной точке вашего ~/.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 check-for-changes, antigen, nvm, zsh-mime-setup, проверка версии интерпретатора и т.д.) я добавить SLOW комментарии в качестве напоминаний, и попытайтесь найти обходные пути. Медленные стартапы могут вызвать много печали, поэтому я стараюсь избегать пакетов zsh/фреймворков, чья внутренняя работа я не грохочу. compinit - самая медленная вещь, с которой я готов жить, и составляет ~ половину полного времени запуска.