如何平均时间命令?


18

我正在执行time一些命令。现在要平均测度,我想对命令运行和计时指定的次数,并获得具有计算出的均值和标准差的结果。结果将是:

avgtime -n 100 my_command

real    0m5.388s stdev 0m0.068s
user    0m5.380s stdev 0m0.067s
sys     0m0.004s stdev 0m0.000s

是否有用于此的UNIX工具?GNU / Linux是否有一个?

Answers:


7

您可以尝试使用timeit模块,该模块可在任何使用Python的系统中使用:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop

使用os.system(),会导致每个命令调用/创建shell的开销。可能更好地使用subprocess.call()
Anthon 2014年

是的,但是无论如何都可能是不变的
bhdnx

4

它不完全是UNIX或GNU / Linux工具,但是您可以轻松地使用R软件环境进行统计计算。(不过,我找不到适合您任务的任何内容。)

编辑我怎么会怀疑这一点,当然还有一个基准包Rrbenchmark。它显然包装了system.time(),您也可以直接使用。 或看看这,一个简单的秒表功能对。 另请参见“执行系统命令” @Rosetta代码(否则,system("command")。)

Edit2我刚刚在右侧“相关”列中看到了“脚本中测量时间”这个问题,也可以使用它,例如,花费时间,进行for循环(N时间),再次花费时间,计算时间跨度,除以N。(甚至更简单,请尝试time ( for-loop ),解析其输出,除以N)。


3

您可以R用来快速计算平均值,标准偏差和其他有趣的值。

例如,您可以使用GNU时间将几个运行时度量值写入CSV文件:

function measure
{
  f=$1; shift
  n=$2; shift
  echo wall,user,sys,rss > "$f"
  for i in $(seq $n); do
    /usr/bin/time --output "$f" --append --format '%e,%U,%S,%M' "$@" >/dev/null
  done
}

然后可以使用R生成值,如下所示:

Rscript --vanilla -e "b=read.csv(file='$f');summary(b);sapply(b, sd);"

我创建了一个小的基准脚本,该脚本还对R输出进行了一些漂亮的打印,例如:

$ benchmark.sh 100 ./some_prog arg1 arg2
n=100 | min    | Q1     | med    | mean   | Q3     | max    | std
wall  | 0.0400 | 0.0400 | 0.0500 | 0.0471 | 0.0500 | 0.0800 | 0.00624
user  | 0.0400 | 0.0400 | 0.0400 | 0.0426 | 0.0400 | 0.0700 | 0.00562
sys   | 0      | 0      | 0      | 0      | 0      | 0      | 0.00000
rss   | 2608   | 2657   | 2704   | 2728   | 2764   | 2920   | 95.06524

1

选项1- sqlite

创建具有命令和时间列的简单表,并使用正确的聚合计算进行查看。计时后,在表中添加一行

优点:与解决方案2相比,定义表更简单。

缺点:您需要(想要吗?)关心数据保留。

选项2- rrdtool

定义rrd数据库文件,数据定义和聚合功能。计时后,使用rrdtool update ...

优点:您可以轻松地使用生成图形rrdtool graph ...。没有数据保留问题(循环数据库)。

缺点:与简单的SQL表/视图相比,很难定义rrd数据库


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.