私は本当にカスタム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つまたはfopen
2つ、および1つfread
がfclose
含まれています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
。期待通りに動作し、非常に高速です!