平均执行时间

时间:2010-09-21 21:57:12

标签: c bash profiling

有没有很好的GNU方法如何测量某些命令行程序的平均(最坏情况,最佳情况)执行时间?我有图像过滤器,未指定数量的图片,在bash中使用for循环过滤它们。到目前为止,我正在使用时间,但我找不到如何获取某些统计信息的方法。

5 个答案:

答案 0 :(得分:6)

您可以将时间输出发送到某个文件,然后“处理”该文件

echo "some info" >> timefile.txt
time ( ./yourprog parm1 parm2 ) 2>> timefile.txt

答案 1 :(得分:4)

有一个名为dumbbench的有趣Perl程序,它本质上是time命令的包装器。它会多次运行您的程序,抛弃异常值,然后计算一些统计信息。

作者有几篇文章(herehere)概述a)为什么基准测试很糟糕,以及b)你可以制作什么样的漂亮图表来使你的基准测试数据少一些

答案 2 :(得分:2)

您与time走在正确的轨道上。这就是我用来执行小代码执行分析的方法。

然后我使用python通过读取time的输出来收集统计信息。为了提高准确性,我通常会进行10到1000次试验,具体取决于每个过程需要多长时间。

我不熟悉任何进行此类分析的预安装GNU应用程序。

答案 3 :(得分:2)

#!/bin/bash
for i in {1..100}
do
  env time --append -o time_output.txt   ./test_program --arguments-to-test-program
done
exit

如果您发现{1..100}语法不适合您,那么您应该查看seq命令。

我使用env time执行时间程序而不是shell的内置命令,它不接受时间程序所需的所有参数。时间程序还会使用其他参数来更改其输出的格式,您可能希望使用该参数来使数据更容易由另一个程序处理。 -p( - portability)参数使其以POSIX格式输出(如BASH的内置时间),但使用-f选项可以获得更多控制。 man 1 time了解更多信息。

收集数据后,一个简单的perl或python脚本可以轻松地解析和分析您的时序数据。

答案 4 :(得分:0)

您应该考虑是否对外循环进行计时并除以重复,而不是分别对每次迭代进行计时。如果你担心抛弃高点和低点,只需再做一些迭代就可以把它们淹没。

time for i in {1..1000}
do
    something
done

你可以capture the output from time in a variable

foo=$( { time {
    echo "stdout test message demo"
    for i in {1..30}
    do
        something
    done
    echo "stderr test message demo" >&2
} 1>&3 2>&4; } 2>&1 )

并做一些假数学

foo=${foo/.}          # "divide" by ...
echo "0.00${foo/#0}"  # ... 1000

或只使用bc

echo "scale=8; $foo/1000" | bc