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

nin*_*rod 4 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)
Run Code Online (Sandbox Code Playgroud)

可以做到吗?

Ada*_*hon 5

更新:使用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)

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

  • 您可以通过定义 `zle-line-init` 小部件(查看手册)在打印提示时运行代码。但所有这些只是对提示进行基准测试,并没有对其进行分析。 (2认同)