简短版本:如何分析 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)
Run Code Online (Sandbox Code Playgroud)
可以做到吗?
更新:使用zle-line-init
(感谢Gilles的提示)
不完全是分析,但从您问题中的文字来看,您似乎主要对衡量插件需要多少延迟感兴趣。
获得此估计值的一种方法是利用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
Run Code Online (Sandbox Code Playgroud)
这样,每个提示的经过时间将写在提示后的括号中,如下所示:
prompt% [0.00013200000000779255]
Run Code Online (Sandbox Code Playgroud)
注意:如果已经定义了precmd
函数或zle-line-init
函数,则需要将各自的函数体添加到现有定义中。For precmd
,您需要将其放在最开始和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
Run Code Online (Sandbox Code Playgroud)
其中最后一个词是链接函数的名称(它不需要具有相同的名称)。
归档时间: |
|
查看次数: |
536 次 |
最近记录: |