ショートバージョン: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
その関数本体を既存の定義に追加する必要があります。precmd
forを最初に配置し、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
ここで最後の単語はリンク関数の名前です(同じ名前を持つ必要はありません)。