新しい対話型bashシェルを起動したときに履歴ファイルを読み取るのにかかる時間を測定します。

新しい対話型bashシェルを起動したときに履歴ファイルを読み取るのにかかる時間を測定します。

sleep実行速度を低下させるコマンドや何かがある場合は、それらを.bashrcプロファイリングして次のように遅い部分を確認できます。

$ printf "set -x\nPS4='+\\\\t '\nexport  HISTFILE=empty\nsleep 4\ntrue\n" > mybashrc
$ > empty
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:13:47 export HISTFILE=empty
+19:13:47 HISTFILE=empty
+19:13:47 sleep 4
+19:13:51 true
$ exit
+19:13:51 exit
exit

real    0m4.022s
user    0m0.010s
sys     0m0.010s

そして その他 オプション 精度を上げるにはGNUを使用してくださいdate

しかし、次のような大規模なbash履歴ファイルがあるとしましょう。

$ yes ls | head -n 9999999 > big-hist
$ du -sh big-hist
29M     big-hist

これで、シェルも非常にゆっくりと起動しますが(マイコンピュータでは約4秒)、時間がどこにかかるのかわかりません.bashrc

$ printf "set -x\nPS4='+\\\\t '\nexport HISTSIZE=-1\nexport HISTFILESIZE=-1\nexport HISTFILE=big-hist\ntrue\n" > mybashrc
$ time bash --rcfile mybashrc -i <<< exit
+ PS4='+\t '
+19:12:23 export HISTSIZE=-1
+19:12:23 HISTSIZE=-1
+19:12:23 export HISTFILESIZE=-1
+19:12:23 HISTFILESIZE=-1
+19:12:23 export HISTFILE=big-hist
+19:12:23 HISTFILE=big-hist
+19:12:23 true
$ exit
+19:12:27 exit
exit

real    0m4.184s
user    0m3.641s
sys     0m0.536s

私が思いつく最善の推測は、次のように実行することです。

$ time bash -i <<< exit
$ SHLVL=2 $ exit
exit

real    0m0.400s
user    0m0.326s
sys     0m0.075s

次に最後の行を追加します.bashrc

HISTFILE=/dev/null

そしてやり直してください:

$ time bash -i <<< exit
$ exit
exit

real    0m0.081s
user    0m0.059s
sys     0m0.023s

これが履歴ファイルの処理に費やされた時間だけを測定するかどうかは完全にはわかりません。

(注:自分で試してみると、.bashrc タイミングが完了した後に最後の行を削除することを忘れないでください!)

私は何年も持っていたので、これは私にとって特に興味深かったです。 有効 無限の歴史 私の場合、.bashrc 新しい対話型シェルの開始時間が影響を受けたことがわかりました。上記のタイミングが正しいと、遅延時間は300ミリ秒を超えました。

答え1

私はあなたの測定を信頼しない理由はありません。

ただしbash、これを実行するstraceと、ファイルが開く順序を確認できます。

$ strace -t -f -e trace=file bash -i <<<exit 2>&1 | grep -E 'open(at)?\(' ; fg
[...]
03:10:39 openat(AT_FDCWD, "/home/hl/.bashrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.DISPLAY", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/inputrc.keys", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.inputrc", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/home/hl/.bash_history", O_RDONLY) = 4
03:10:39 openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 4

fgこれがなぜ必要なのかわかりません。おそらく、シェルをバックグラウンドで送信することは私のシェル構成にあるかもしれません。

関連情報