異なるシェル間のスクリプト実行時間を比較するために、一部のSE回答でbash
は組み込み time
コマンドは次のとおりです。
time bash -c 'foo.sh'
time dash -c 'foo.sh'
...など、テストする各シェルについて。これらのベンチマークは、各シェルをロードして初期化するのに必要な時間をなくすことはできません。それ自体。たとえば、上記の両方のコマンドが次の場所に保存されているとします。フロッピーディスクの読み取り速度が初期の低速デバイス、(124KB/秒)、dash
(~150K実行可能ファイル)はほぼロードされます。7倍より速いbash
(〜100万)、シェルのロード時間はtime
数字を歪ませます。これらのシェルのプリロード時間foo.sh
は、各シェルで実行時間を測定することには関係ありません。後ろにシェルがロードされます。
スクリプトタイミングの実行に最適な移植可能で一般的なユーティリティは何ですか?以内に各シェル?したがって、上記のコードは次のようになります。
bash -c 'general_timer_util foo.sh'
dash -c 'general_timer_util foo.sh'
注:シェルなし組み込み time
単一のコマンドは移植可能でも普遍的でもないからです。
utilがシェルの内部コマンドとパイプに費やされる時間をベンチマークできる場合は良いでしょう。これにより、ユーザーが最初にスクリプトにラップする必要がなくなります。次の人工構文が役に立ちます。
general_timer_util "while read x ; do echo x ; done < foo"
time
この問題を解決できるシェルがあります。作品などbash -c "time while false ; do : ; done"
。システムで動作しているものと動作しないことを確認するには、次の手順を試してください。
tail +2 /etc/shells |
while read s ; do
echo $s ; $s -c "time while false ; do : ; done" ; echo ----
done
答え1
注意すべき点はtime
POSIXで指定、そしてAFAICT POSIXに記載されている唯一のオプション(-p
)は、さまざまなシェルで正しくサポートされています。
$ bash -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
$ dash -c 'time -p echo'
real 0.01
user 0.00
sys 0.00
$ busybox sh -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
$ ksh -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
答え2
私は使う牛に似た一種の栄養 date
高解像度タイマーをサポートするコマンド:
START=$(date +%s.%N)
# do something #######################
"$@" &> /dev/null
#######################################
END=$(date +%s.%N)
DIFF=$( echo "scale=3; (${END} - ${START})*1000/1" | bc )
echo "${DIFF}"
次にスクリプトを次のように呼び出します。
/usr/local/bin/timing dig +short unix.stackexchange.com
141.835
出力単位はミリ秒です。
答え3
ご存知のように、このtime
ユーティリティは通常シェルに組み込まれているため、「中立」タイマーとしては役に立ちません。
ただし、このユーティリティは通常外部ユーティリティとしても使用でき、提案されたタイミング/usr/bin/time
実験を実行するために使用される可能性が高いです。
$ bash -c '/usr/bin/time foo.sh'
答え4
解決策は入力のために数回修正され、主におよび/proc/uptime
//dc
を使用します。bc
awk
アクティブ制御:
#!/bin/sh
read -r before _ < /proc/uptime
sleep 2s # do something...
read -r after _ < /proc/uptime
duration=$(dc -e "${after} ${before} - n")
# Alternative using bc:
# duration=$(echo "${after} - ${before}" | bc)
# Alternative using awk:
# duration=$(echo "${after} ${before}" | awk '{print $1 - $2}')
echo "It took $duration seconds."
明らかに家庭は/proc/uptime
存在し、何らかの形をしています。