如何在 zsh 中分析提示渲染时间?

如何在 zsh 中分析提示渲染时间?

简短版本:如何分析 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
    

    其中最后一个单词是链接函数的名称(不需要具有相同的名称)。

相关内容