脚本用于运行程序100次并对结果进行greping



我想写一个脚本,这样我就可以运行我的程序100次,并grep执行时间。目前我有这个:

#!/bin/bash
i=1
while [ $i -lt 100 ]
do
(time -p ./mdu -j $i /pkg) &>> tempfile.txt
echo $i
let i=$i+1
done
cat tempfile.txt | grep real > plot.txt

然而,这并没有给我想要的输出。我希望只获得100次运行的执行时间,但plot.txt输出了551行数据。所有的行都包含&;real 1.31(随机时间)&;但是我感觉我得到了很多重复的东西。

我在这里做错了什么?

在编写代码时,将资源使用统计信息以及程序的标准输出和错误输出附加到tempfile.txt。所以如果这最后两条流含有real,它们会污染你的结果。试一试:

time (<your-program> &>> log.txt) &>> tempfile.txt

但是为什么不使用time实用程序,而不是bash内置程序,以及它的选项(time -pao tempfile.txt)来只将统计信息附加到文件中呢?比如:

#!/bin/bash
i=1
while [ $i -lt 100 ]
do
/usr/bin/time -pao tempfile.txt ./mdu -j $i /pkg &>> log.txt
echo $i
let i=$i+1
done
grep "real" tempfile.txt > plot.txt

此外,如果您使用time实用程序,您甚至可以指定输出格式,而不是使用-pPOSIX格式并grep输出。如果,对于您的绘图,仅使用[小时:]分钟:秒:

的实时值会更方便
/usr/bin/time -f'%E' -ao tempfile.txt ...

如果你想在秒内完成:

/usr/bin/time -f'%e' -ao tempfile.txt ...

您可能有551行数据,因为您一直附加到tempfile.txt并且从未删除其内容。

作为旁注,你的循环运行99次,而不是100次。使用基于零的编号或<=

最后但并非最不重要的是,time相当棘手(在其内置形式中),特别是由于它与管道交互的方式。

run_n_times() {
local -ir N="$1"
shift
local -ar args=("$@")
local -i i
for ((i = 1; i <= N; ++i)); do
( time -p "${args[@]//#/"$i"}"; ) 
|& awk '/^real/ {print $2}'
done
}
# A simple test:
run_n_times 3 sleep '#'
# The real thing:
run_n_times 100 ./mdu -j '#' /pkg