
私はジョブ制御とパイプ/リダイレクト機能を備えたシンプルなシェルをCで書いています。このシェルの実行時間(実際、ユーザー、およびシステム)をBASHとどのように比較しますか?たとえば、lsコマンドの実行時間を測定したいとします。問題は、実行時間が異なることです。 lsコマンド(壁時間)は、BASH組み込み機能を使用して測定した約0.002秒です。複数の実行を測定する方法は?たとえば、単純なBASHスクリプトを使用して複数の実行を測定しました。
for i in {1..5000}
do
ls
done
私のシェルで同様のことをする方法がわかりません。 lsコマンドを5000回解析して実行するシェルコードにforループを作成しましたが、bashスクリプトのforループはおそらくはるかに遅いので、比較する方法はありません。
答え1
これにより、2番目のセグメンテーションが提供されますが、少なくともls
。
for i in {1..5000}
do
start=${SECONDS}
ls
end=${SECONDS}
echo that took $((end - start)) seconds
done
このdate
コマンドを使用して、エポック後のナノ秒を取得できます。
for i in {1..5000}
do
start=$(date +%s%N)
ls
end=$(date +%s%N)
echo that took $((end - start)) nanoseconds
done
答え2
何をテストしたいのかわかりませんが、基本的なアプローチは実際にX回実行してから時間の平均を求める必要があります。ここに投稿した回答をテストするために使用する小さなシェル関数があります。これはあなたのニーズに合わせて調整できます。平均化の基本的なロジックを理解し、それを使用できる必要があります。
timethis ()
{
max=$1;
shift;
for com in "$@";
do
printf 'COMMAND: %s\n' "$com";
c=0;
while [[ $c -lt $max ]]; do
let c++;
( time -p eval "$com" ) 2>&1 | grep --color -oP 'real.*?\K[\d\.]+';
done | awk -vm=$max '{k+=$1}END{print (k/m)}';
done
}