1. 概要

コードのブロックの経過時間を、そのブロックの実行にかかる時間として定義します。このチュートリアルでは、Linuxで経過時間を測定する方法について説明します。

2. dateコマンドの使用

ご存知のように、sleepコマンドは指定された秒数待機します。 これをサンプルブロックコードとして使用します。これにより、コードブロックの実行にかかる時間をある程度正確に定義できるようになります。

dateを使用して経過時間を計算してみましょう。

elapsed_time.shスクリプトを作成しましょう。

start=$(date +%s)
sleep 5
sleep 7
end=$(date +%s)
echo "Elapsed Time: $(($end-$start)) seconds"

$()を使用して、startおよびend変数を初期化します。 $()はコマンド置換用です。 そのため、内部でコマンドを実行し、対応する変数に結果をキャプチャします。

算術演算の結果を計算するために$(())を使用したことに注意してください

スクリプトを実行してみましょう。

$ ./<em>elapsed_time</em>.sh
Elapsed Time: 12 seconds

3. 内部変数の使用$SECONDS

Bashシェルの内部変数$SECONDS を使用して、経過時間を計算できます。 参照されると、 $ SECONDSは、現在のシェルが呼び出されてから経過した秒数を出力します。 次に、elapsed_time.shスクリプトの別のバージョンを作成しましょう。

SECONDS=0
sleep 5
sleep 7
echo "Elapsed Time (using \$SECONDS): $SECONDS seconds"

コードブロックが開始する前に、SECONDS変数の値をゼロに設定しました。 整数以外の値を使用すると、ゼロに設定されることに注意してください。

サンプルコードブロックが終了すると、 $SECONDSにはそのコードブロックの実行時間が含まれます。 この場合、算術演算は必要ないことに注意してください。

スクリプトをもう一度実行して、結果を確認してみましょう。

$ ./script.sh
Elapsed Time (using $SECONDS): 12 seconds

4. BashShellのTIMEFORMATを使用する

BashシェルのTIMEFORMATtimeコマンドと組み合わせて使用して、コマンドのブロックに費やされた正確な時間をミリ秒単位で計算することもできます。 計算スクリプトの別のバージョンを作成しましょう。

TIMEFORMAT='It took %R seconds.'
time {
sleep 5
sleep 7
}

TIMEFORMAT 文字列を定義した後、コマンドを time{}でラップする必要があります。 TIMEFORMAT は、 time{}ラッパー内のブロックコードの実行が終了した後に出力される文字列形式です。 %Rは、経過時間をミリ秒単位の精度で出力するように指定します。

スクリプトをテストしてみましょう。

$ ./elapsed_time.sh
It took 12.008 seconds.

TIMEFORMAT では、 Rの前の桁を使用して、小数点以下に印刷する小数桁数を指定できます。 したがって、値がゼロ(%0R )の場合、経過時間出力に小数点は出力されません。

TIMEFORMAT='It took %0R seconds.' 
time { 
sleep 5 
sleep 7 
}

スクリプトをもう一度実行してみましょう。

$ ./elapsed_time.sh 
It took 12 seconds.

精度を指定するオプションの数字のデフォルト値は3です。 3より大きい数値を指定すると、3に置き換えられることに注意してください。

time コマンドを使用すると、ユーザーモードまたはシステムモードで費やされたCPU時間を計算することもできます。

5. ナノ秒単位の経過時間

これらのメソッドはすべて、経過時間を秒またはミリ秒で計算します。 経過時間をナノ秒単位で指定する場合は、 t 日付コマンドの%Nオプションを使用できます。

start=$(date +%s%N)
sleep 5
sleep 7
end=$(date +%s%N)
echo "Elapsed time: $(($end-$start)) ns"

結果を確認しましょう:

$ ./elapsed_time.sh
Elapsed time: 12023674735 ns

時間をミリ秒単位で再度取得する場合は、ナノ秒の出力を100万で割る必要があることに注意してください

start=$(date +%s%N)
sleep 5
sleep 7
end=$(date +%s%N)
echo "Elapsed time: $(($(($end-$start))/1000000)) ms"

それでは、この新しいバージョンを実行してみましょう。

$ ./elapsed_time.sh
Elapsed time: 12022 ms

6. 結論

この記事では、一連のコマンドの経過時間を測定しました。

まず、dateコマンドを使用して経過時間を計算しました。 次に、 $ SECONDS 変数を使用しました。これは、現在のシェルが開始してからの経過時間を保持するBashシェルの内部変数です。

その後、 TIMEFORMAT 組み込み変数と%R オプションを使用して、ミリ秒の精度で経過時間を計算しました。

最後に、 date コマンドの%N オプションを導入して、ナノ秒までの経過時間を計算しました。