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(ありがとうございます。ザイルズヒントが必要な場合)

正確な分析ではありませんが、質問のテキストを見ると、主にプラグインに必要な待ち時間を測定することに興味があるようです。

この推定値を得る1つの方法は、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その関数本体を既存の定義に追加する必要があります。precmdforを最初に配置し、forを最後に配置する必要があります。zle-line-initこれは、2つのアイテムの既存のコンテンツがヒント(またはヒントのように見える)をレンダリングするのにかかる時間に影響を与える可能性があるためです。

  • precmd定義されていることを確認するには、を実行しますwhence -c precmd
  • zle-line-init走るためzle -lL zle-line-init。設定すると、次の行が印刷されます。

    zle -N zle-line-init _zsh_highlight_widget_zle-line-init
    

    ここで最後の単語はリンク関数の名前です(同じ名前を持つ必要はありません)。

関連情報