有没有很好的GNU方法如何测量某些命令行程序的平均(最坏情况,最佳情况)执行时间?我有图像过滤器,未指定数量的图片,在bash中使用for循环过滤它们。到目前为止,我正在使用时间,但我找不到如何获取某些统计信息的方法。
答案 0 :(得分:6)
您可以将时间输出发送到某个文件,然后“处理”该文件
echo "some info" >> timefile.txt
time ( ./yourprog parm1 parm2 ) 2>> timefile.txt
答案 1 :(得分:4)
有一个名为dumbbench的有趣Perl程序,它本质上是time
命令的包装器。它会多次运行您的程序,抛弃异常值,然后计算一些统计信息。
作者有几篇文章(here和here)概述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