将使用 /usr/bin/time 测量 for 循环的结果分配到变量中

将使用 /usr/bin/time 测量 for 循环的结果分配到变量中

我需要在for循环内多次执行curl命令,并获取执行单个curl所需的平均时间。这就是我所拥有的:

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

我的建议是(稍微修改一下,因为我没有你的curl/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 的环境中即可。

请注意,shell 算术是基于整数的,因此对于浮点值,请使用类似bc.我的time输出有 3 个小数位,所以这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)

相关内容