私の Bash シェルは起動に 3 ~ 4 秒かかりますが、 で起動すると--norc
すぐに実行されます。
私は「プロファイリング」を開始し/etc/bash.bashrc
、~/.bashrc
手動でreturn
ステートメントを挿入して速度の向上を模索しましたが、これは定量的なプロセスではなく、効率的ではありません。
Bash スクリプトをプロファイルし、実行に最も時間がかかるコマンドを確認するにはどうすればよいでしょうか?
ベストアンサー1
GNU (またはナノ秒を出力できる別のバージョン) をお持ちの場合はdate
、Bash スクリプトの先頭/etc/bash.bashrc
(またはトレースを開始したい場所) でこれを実行してください。
PS4='+ $(date "+%s.%N")\011 '
exec 3>&2 2>/tmp/bashstart.$$.log
set -x
追加
set +x
exec 2>&3 3>&-
の末尾~/.bashrc
(またはトレースを停止したい Bash スクリプトのセクションの末尾)に\011
8 進数のタブ文字を入力します。
実行された各コマンドの秒.ナノ秒のタイムスタンプを示すトレース ログが取得されます/tmp/bashstart.PID.log
。ある時点から次の時点までの差は、介在するステップにかかった時間です。
対象を絞り込むにつれて、set -x
後またはset +x
前に移動できます (または、関心のあるいくつかのセクションを選択的に囲むことができます)。
GNU のナノ秒ほどきめ細かくはありませんがdate
、Bash 5 にはマイクロ秒単位で時間を表す変数が含まれています。これを使用すると、行ごとに外部実行ファイルを生成する必要がなくなり、Mac や GNU のない他の環境でも動作しますdate
(もちろん、Bash 5 があれば)。 の設定を変更してくださいPS4
:
PS4='+ $EPOCHREALTIME\011 '
BASH_XTRACEFD
@pawamoyが指摘したように、 Bash 4.1以降を使用している場合は、トレースの出力を別のファイル記述子に送信するために使用できます。この答え:
#!/bin/bash
exec 5> command.txt
BASH_XTRACEFD="5"
echo -n "hello "
set -x
echo -n world
set +x
echo "!"
これにより、トレース出力はファイルに残されcommand.txt
、stdout
通常stdout
どおり出力されます (または個別にリダイレクトされます)。
結果を理解する
OpenOffice / Libre calc を使用すると、各コマンドにかかった時間と実行中の合計を確認できるため、以下の例では lesspipe に 6 ミリ秒かかっていることが簡単にわかります。
- 結果のログ ファイルをコピーして新しいスプレッドシートに貼り付けます。
- 次のタイムスタンプとの差分のタイムスタンプの後に新しい列を挿入します。列 C を挿入した場合は、
=B2-B1
セル C1 に挿入し、そのセルを C 列全体にコピーして貼り付けます。 - 絶対タイムスタンプの代わりに、最初のタイムスタンプをコピーし、タイムスタンプ列を選択してCtrl+Shift+Vを押すことで、0から始めることができます。特殊貼り付け > 減算。
- あなたはできるXより大きい色の値長い個々のコマンドを強調表示するには赤にします。