/usr/bin/time을 사용하여 for 루프의 결과를 변수에 할당합니다.

/usr/bin/time을 사용하여 for 루프의 결과를 변수에 할당합니다.

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 tokendo'가 발생합니다.

나는 또한 다음을 테스트했습니다.

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

timebash가 내장되어 있기 때문에 stderr리디렉션을 시간 호출 "외부"에 배치해야 합니다. 이것이 바로 주요 부분을 bash -c ....

루프를 통해 매번 TIMEFORMAT을 설정할 필요는 없습니다. bash/time이 호출되는 환경에 넣으면 됩니다.

쉘 연산은 정수 기반이므로 부동 소수점 값 의 경우 bc.timebc

답변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)

관련 정보