平均执行时间

有没有什么好的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