好像我的shell正在以方式启动太长时间。有什么方法可以对它进行分析,这样我就可以弄清楚是什么在减慢它的速度呢?
答案 0 :(得分:46)
尝试在文件开头添加:
# 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
(和OS支持)需要具有纳秒输出。
编辑:
添加评论
编辑2:
如果你有zsh 4.3.12或更高版本,你应该可以像这样设置PS4
而不是使用date
命令:
zmodload zsh/datetime
setopt promptsubst
PS4='+$EPOCHREALTIME %N:%i> '
它应该适用于Linux和OS X,以提供纳秒精度。
答案 1 :(得分: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
如果我看到一个太慢的启动,这会提醒我,我把它留作永久包装。
对于更复杂的测量,有一个名为zprof
的zsh模块。这就像暂时将~/.zshrc
的内容包含在zmodload zsh/zprof
和zprof
中一样简单。这将转储一些易于解释的详细分析表。
zshmodules(1)
联机帮助页中的详细信息。
当我发现特别慢的东西(rbenv init,vcs_info check-for-changes,antigen,nvm,zsh-mime-setup,解释器版本检查等)时,我添加SLOW
条评论为提醒,并尝试找到变通方法。缓慢的初创公司可能会引起很多悲伤,所以我倾向于避免zsh包/框架词,其内部工作我不会理解。 compinit是我愿意忍受的最慢的东西,是总启动时间的一半。
答案 2 :(得分:0)
Zsh具有概要分析模块。在~/.zshrc
或~/.zshenv
的开头添加如下内容:
# Uncomment to use the profiling module
# zmodload zsh/zprof
取消注释,启动新的交互式外壳,然后运行命令zprof
。您将获得一份详细的项目清单,可以查看这些清单,以更好地了解您的性能瓶颈在哪里:
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
这是speeding up zsh的单行本,如果开始时间很零星,您将不胜感激:
for i in $(seq 1 10); do /usr/bin/time zsh -i -c exit; done
运行该作业,您应该看到如下输出:
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
利润。