Кажется, что моя оболочка слишком долго запускается. Есть ли способ профилировать его, чтобы я мог понять, что замедляет его так много?
Могу ли я профилировать мой .zshrc/.zshenv?
Ответ 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 - самая медленная вещь, с которой я готов жить, и составляет ~ половину полного времени запуска.