简短版本:如何分析 zsh 提示符的每个渲染?
长版本:我最近遇到了一个插件(rupa/z),安装后,我的 zsh 提示渲染时间明显缩短。我想测量这个插件在加载时对我的 zsh 提示渲染时间造成了多大影响。
例如,当我说提示渲染时间时,我并不是指在我发出命令时出现第一个 zsh 提示所需的时间exec zsh
(这是通过发出 来实现的time zsh -i -c "print -n"
)。
我说的是 zsh 完全加载后再次提示我所需的时间。换句话说,我想实现这个目标:
~ $ ls (when i hit enter, start counting)
code/ notes/ file.txt
~ $ (stop counting when this prompt appears. show me elapsed time)
可以吗?
答案1
更新:使用zle-line-init
(感谢吉尔斯以获得提示)
不完全是分析,但从您问题中的文本看来,您主要感兴趣的是衡量插件需要多少延迟。
获得此估计的一种方法是利用precmd
钩子,该钩子每次都会运行前呈现提示,以及zle-line-init
每次行编辑器启动时运行的小部件。
以下应该可以解决问题。只需将其添加到您的~/.zshrc
.
# set type of SECONDS and start to float to increase precision
typeset -F SECONDS start
# define precmd hook function
precmd () {
# save time since start of zsh in start
start=$SECONDS
}
# define zle-line-init function
zle-line-init () {
# print time since start was set after prompt
PREDISPLAY="[$(( $SECONDS - $start ))] "
}
# link the zle-line-init widget to the function of the same name
zle -N zle-line-init
这样,每个提示的经过时间将写在提示后面的括号中,如下所示:
prompt% [0.00013200000000779255]
笔记:如果precmd
函数或zle-line-init
函数已经定义,则需要将各自的函数体添加到现有定义中。对于precmd
,您需要将其放在最开始,而 for 则zle-line-init
放在最后,因为两者的现有内容可能会影响渲染提示(或看起来像提示的内容)所需的时间。
- 要查明是否
precmd
已定义,请运行whence -c precmd
. 对于
zle-line-init
运行zle -lL zle-line-init
。如果已经设置,它将打印一行,例如zle -N zle-line-init _zsh_highlight_widget_zle-line-init
其中最后一个单词是链接函数的名称(不需要具有相同的名称)。