読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

ソフトウェアの起動時間を測ってみたい

プログラムの実行時間を図るにはtimeというコマンドを使う。

$ time ls -la >/dev/null

real    0m0.015s
user    0m0.004s
sys     0m0.008s

例えば、ソフトウェアが起動するまでの時間を測ろうと思ったらどうしたらいいんだろう。 起動してプロセスのステータスがスリープになるまでの時間を起動時間とする、といった アプローチでシェルスクリプトを書いてみた。

#!/usr/bin/env bash

# 1970-01-01 00:00:00からの秒数.ミリ秒返す
function millisec()
{
    echo $(date +%s).$(expr $(date +%N) / 1000000)
}

exec_cmd_args=$*

# 計測 開始時間
start_time=$(millisec)

# バックグラウンド実行
$exec_cmd_args &
pid=$!

#ps結果のSTATが"S"になったら起動したとみなす
while :
do
    stat=$(ps $!|tail -n 1|awk '{print $3}')
    if echo $stat|grep "^S" >/dev/null 2>&1; then
        break
    fi
done

# 計測 終了時間
end_time=$(millisec)

# プロセス強制終了
kill -9 $pid

echo "$end_time - $start_time"|bc

解説

調べながらこれ書いていて、今まで知らなかったことがけっこう分かったので、備忘録的 にメモしておく。

dateのフォーマット指定で使える値。%sで「1900-01-01 00:00:00」からの秒数が得 られる。%Nでナノ秒単位が得られる。timeコマンドで得られるのはミリ秒までなので、 それ以下は意味がないかなと思って次のようにした。

function millisec()
{
    echo $(date +%s).$(expr $(date +%N) / 1000000)
}

exprでは細かい数値の計算ができないが、bcを使うと小数点以下の計算ができる。標 準入力で渡す必要がある。

echo "$end_time - $start_time"|bc

期待した結果が得られたかというと、イマイチ

いざ実行してみると、計測結果は必ず出るんだけど、エラーがでたり、でなかったりする。 計測時間についてもけっこうバラつきがあったりして、有意な結果が得られたとはいいが たい。連続実行すれば、そりゃそうなるだろうという気もするし、デスクトップ環境で動 かしていれば、その時々の状態でバラつきもするだろう、という気もする。もし使ってみ て有意な結果が得られるようならこっちの環境の問題だとも思うが、うーん。ソフトウェ アの比較でよく出てくる軽い・重いという評価を数値で表せたらな、と思っただけなんだ けどね。

広告を非表示にする