bashではなくユニバーサル `time`ベンチマークの代替? [閉鎖]

bashではなくユニバーサル `time`ベンチマークの代替? [閉鎖]

異なるシェル間のスクリプト実行時間を比較するために、一部の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

注意すべき点はtimePOSIXで指定、そして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を使用します。bcawkアクティブ制御:

#!/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存在し、何らかの形をしています。

関連情報