2015-02-08 52 views
-2

我有一个简单的C程序,可以根据输入的文件来分析所需的时间。它将句子中花费的时间打印到标准输出。有没有办法让bash脚本多次使用特定的输入来运行这个程序,并从每次迭代(从stdout)中抽出时间运行,这样我就可以在所有迭代中平均时间?我想制作一个简单的bash脚本,它可以运行我的可执行文件100多次

所以我将运行原来的C程序,像这样:

./test文件1文件2 out.out

并运行后,它会打印 “经过时间为XX.XX秒”到stdout 。

特别是,我将如何编写一个在相同的输入文件上运行100次测试的shell脚本,并将所有运行的运行时间平均化?

谢谢,抱歉没有澄清

回答

1

像这样也许:

#!/bin/bash 
start=$SECONDS 
for i in {0..99}; do 
    ./program file1 file2 
done 
end=$SECONDS 
echo "scale=2;($end-$start)/100"|bc 

我只是用$SECONDS(其中bash计数为你反正)找到,而不需要经过的总时间运行awk。然后在最后,我让bc以秒为单位计算浮点平均时间到小数点后两位(scale=2)。

+0

谢谢你,但是我做了修改,以我原来的职位,只是想知道如果这可能会影响你的答案。 所以像test.sh这样的简单脚本,对于我在{0..99}中的“test.sh file1 file2 out.out” 运行;做 ./test $ 1 $ 2 $ 3 但是,我将如何平均所有迭代的时间? – 2015-02-08 20:17:20

+0

我简化了它 - 请再看一下。 – 2015-02-08 21:18:27

+0

谢谢,这正是我需要的! – 2015-02-09 05:51:45

0

尝试

for i in {0..99}; 
    /usr/bin/time test file1 file2 out.out 2>&1 >/dev/null | awk ' 
     {split($3, ct, "[:a-zA-Z]"); summ += ct[1]; sums += ct[2]} 
    END {print summ/100.0, sums/100.0} 
    ' 
done 

重定向的顺序是非常重要的;当stdout变为null时,您希望将stderr(time命令的输出)传送到awk。如果你没有任何标准输出,你可以删除>/dev/null。你不能使用内置的bash time,因为它会计时整个管道。

您可以处理分秒款项,只要你想,要么得到一个总时间,平均时间等

+0

谢谢!但是,当我尝试了这一点,我得到了一些语法错误,我会尽力找到我的方式。虽然谢谢! – 2015-02-08 20:37:46

+0

使用@ MarkSetchell的答案获取总时间,然后通过awk重定向整个输出。或者,通过仅处理具有/ elapsed /的行来使awk脚本更复杂一点, – mpez0 2015-02-08 20:44:42

相关问题