平均执行时间
有没有什么好的GNU方法如何测量某些命令行程序的平均(最坏情况,最佳情况)执行时间? 我有图像filter,未指定数量的图片,在bash中使用for循环过滤它们。 到目前为止,我正在使用时间 ,但我找不到如何获得一些统计数据的方法。
有一个有趣的Perl程序叫做dumbbench ,它本质上是time
命令的包装器。 它会多次运行您的程序,抛弃exception值,然后计算一些统计信息。
作者有几篇文章( 这里和这里 )概述a)为什么基准测试很糟糕,以及b)你可以制作什么样的漂亮图表来使你的基准测试数据少一些。
您可以将时间输出发送到某个文件,然后“处理”该文件
echo "some info" >> timefile.txt time ( ./yourprog parm1 parm2 ) 2>> timefile.txt
随着time
你走在正确的轨道上。 这是我用来执行小代码执行分析的方法。
然后我使用python通过读取time
输出来收集统计信息。 为了提高准确性,我通常会进行10到1000次试验,具体取决于每个过程需要多长时间。
我不熟悉任何进行此类分析的预安装GNU应用程序。
#!/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脚本可以轻松地解析和分析您的计时数据。
您应该考虑是否对外循环进行计时并除以重复,而不是分别对每次迭代进行计时。 如果您担心丢弃高低,只需再做几次迭代就可以淹没它们。
time for i in {1..1000} do something done
您可以在变量中捕获时间输出 :
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