PS1生成の最適化

PS1生成の最適化

私は本当にカスタムPS1変数の高速計算速度が大好きです。したがって、Bashスクリプトには、次のようにPS1変数を設定する行があります。

PROMPT_COMMAND='PS1="$(/home/username/.config/bash/ps1 ${PWD})"'

ここにps1現在の作業ディレクトリが与えられたら、PS1をインポートするための私の実行可能ファイルがありますPWD

この設定でEnterキーを押すと、プロンプトなしで新しい行が表示されます(主にカーソルが行の先頭にあったのでこれがわかりました)。通常の状況では、これはほとんど発生しませんsh

私はいつも同じディレクトリにいてEnterキーを押すだけで同じプロセスを繰り返し実行できるとします。その後、カーソルが行の先頭にあることがわかります。しかしhyperfine言う

~/.c/bash $ hyperfine -N --warmup=1000 "/home/username/.config/bash/ps1 $PWD"
Benchmark 1: /home/username/.config/bash/ps1 /home/username/.config/bash
  Time (mean ± σ):       0.5 ms ±   0.1 ms    [User: 0.4 ms, System: 0.0 ms]
  Range (min … max):     0.4 ms …   2.1 ms    5335 runs

したがって、60 Hzのコンピュータ画面(つまり、各フレーム間で約16ミリ秒)の場合、プロンプトはほぼすぐに生成され、空白行はほとんど描かれてはいけません。

実行ファイルが非常に高速ですが、これが起こるのはなぜですか?結果が示すように、実行可能ファイルはかなり最適化されていますが、いくつか、1つまたはfopen2つ、および1つfreadfclose含まれていますprintf

PS1をより速く作成/印刷できますか?できればどうですか?

ベストアンサー1

私は問題を解決することに成功しました。 Bashのソースコードをダウンロードし、/home/username/.config/bash/ps1そのソースコードをBashのソースコードにマージしました。鍵はstatic void execute_prompt_command()変更ですeval.c。 Bashの内部機能の一部を学ぶ必要があるかもしれませんが、ソースコードをダウンロードしてから約15分で完了しました。たとえば、pwd = get_string_value("PWD")fromの代わりにPWDを介してインポートする必要がありますargv。期待通りに動作し、非常に高速です!

おすすめ記事