forループ内でカールコマンドを複数回実行し、単一のカールを実行するのに必要な平均時間を取得する必要があります。これが私が持っているものです:
while read query; do
TIMEFORMAT=%R; time for i in {1..3}; do curl -s -w '\n' -XPOST -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode query='${query}' ${nginx_url} > /dev/null; done
done < queries.txt
秒はstdoutに印刷されますが、平均を取得するにはその数値を変数に割り当てて3で割る必要があります。
私がテストしたものは次のとおりです。
realtime=$(time -f "%E" for i in {1..3} ..etc..)
realtime=`time -f "%E" for i in {1..3} ..etc..`
ただし、これにより構文エラー./test-suite.sh: line 23: syntax error near unexpected token
do'が発生します。
私も次のことをテストしました。
realtime=$(bash -c "TIMEFORMAT=%R; time for i in {1..3} ..etc..")
realtime=$(bash -c "time -f "%E" for i in {1..3} ..etc..")
realtime=$(bash -c "TIMEFORMAT=%R; time for i in {1..3} do ..etc.. ; done; echo $realtime")
すべて役に立たない。どんなアイデアでも大歓迎です。
答え1
私の提案は次のとおりです(カール/ HTTP設定がないため、少し変更されました)。
$ t=$(TIMEFORMAT=%R bash -c 'time for i in {1..3}; do sleep $((RANDOM % 5)); done' 2>&1)
$ avg=$(bc <<< "scale=3; $t/3")
$ echo $avg # YMMV
2.667
time
bashが組み込まれているので、stderr
リダイレクトを時間呼び出し「外部」に配置する必要があります。これがまさに主要部分をbash -c ...
。
ループを介して毎回TIMEFORMATを設定する必要はありません。 bash/time が呼び出される環境に入れるだけです。
シェル演算は整数ベースなので、浮動小数点値の場合bc
。time
bc
答え2
わかりました。コマンドも括弧で囲む必要があります。
mytime=$(time (for i in {1..3}; do curl -s -w '\n' -XPOST -H 'Content-Type: application/x-www-form-urlencoded' --data-urlencode query='select distinct ?Concept where {[] a ?Concept} LIMIT 100' http://143.233.226.61:443/sparql > /dev/null; done) 2>&1 1>/dev/null)