web-dev-qa-db-ja.com

bashrc / zshrcとプロンプトレンダリング時間をベンチマークする方法は?

現在、プロンプトで新しいものを試しているので、パフォーマンスへの影響を知る方法が必要です。

プロンプトのレンダリングにかかる​​時間と。* rcのソースにかかる時間を監視するにはどうすればよいですか?

6

これらのコマンドを使用すると、rcファイルのソーシングを含む起動時間をベンチマークできるはずです(+1回の印刷呼び出し。オーバーヘッドはそれほど増えないはずです)。

time zsh -i -c "print -n"
time bash -i -c "echo -n"

.zshrcに1000行以上ある場合、cygwinのインストールには0.3秒かかります。いいえ、それは実際にはハイエンドマシン(iCore2Duo P8700)ではありません。

プロンプトレンダリング時間について:

  • bashでは、組み込みコマンドをtimeすることができます。ただし、$PS1をプロンプトとしてレンダリングする可能性はわかりません。

  • zshでは逆で、print -P $PS1 $RPS1を使用すると、印刷コマンドでプロンプトを表示できます。 (man zshbuiltins: "[print] -Pプロンプト拡張を実行する")。しかし、組み込みコマンドでは時間が機能しないようです。これが私がこれを一緒にハッキングした理由です:

    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    overhead=$((cumul/100.))
    cumul=0; for i ({0..99}) {
      start=$(date +%s.%N)
      print -P $PS1 $RPS1
      end=$(date +%s.%N)
      (( cumul+= (end-start) ))
    }
    print $((cumul/100. - overhead))
    

    まず、これはdateコマンドによって引き起こされるオーバーヘッドを測定します。より良い統計のために100回行われます。次に、print -P $PS1 $RPS1が含まれ、これも100回実行され、最初の部分で決定されたオーバーヘッドが差し引かれます。連続して呼び出すと、1msの数字は信頼できないことがわかりますが、10msの数字は信頼できるようです。秒単位の期待値で十分です。

しかし、@MichaelKjörlingがコメントですでに述べたように、プロンプトはすぐにレンダリングされるはずです。したがって、プロンプトを最適化する方法を検討するか、考慮に入れる必要があります。私の経験では、プロンプトのレンダリング時間(質問のように)はプロンプト表示時間のごく一部のみ。 (ここでは主にZシェルについて説明しますが、bashでも同様の概念があると思います。)プロンプトが表示される前に実行される関数が他にもあるためです。これがすぐに頭に浮かぶことです。

  • precmd:各プロンプトの前に実行されます。 which precmdを使用して、ケースの内容を確認してください
  • オプションsharedhistoryを有効にしている場合、ファイル~/.zsh_history(または名前を付けたもの)が読み取られます。特に、ホームディレクトリがリモートファイルシステム上にある場合、大幅な遅延が発生する可能性があります。また、NFSサーバーの負荷が高い場合に、プロンプトが表示される数秒前に時々観察します。

外部プログラム/内部関数の時間要件を詳細に分析するためのツールは、によってロードされるzsh/zprofモジュールです。

zmodload zsh/zprof

From man zshmodules: "ロードされると、zsh/zprofによってシェル関数がプロファイリングされます。プロファイリングの結果は、このモジュールで使用できるzprof組み込みコマンドを使用して取得できます。"

4
mpy