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)