¿Cómo promediar los comandos de tiempo?


18

Estoy timeusando algunos de mis comandos. Ahora, para promediar las medidas, me gustaría ejecutar y cronometrar mis comandos un número específico de veces, y obtener los resultados con una media calculada y una desviación estándar. El resultado sería como:

avgtime -n 100 my_command

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

¿Existe una herramienta UNIX para esto? ¿GNU / Linux tiene uno?

Respuestas:


7

Puede intentar usar el módulo timeit, disponible en cualquier sistema con Python:

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

usando os.system(), causa la sobrecarga de llamar / crear un shell con cada comando. Probablemente mejor usar subprocess.call ()
Anthon

cierto, pero probablemente sería constante-ish de todos modos
bhdnx

4

No es exactamente una herramienta UNIX o GNU / Linux, pero podría usar con bastante comodidad el entorno de software R para computación estadística para esto. (Sin embargo, no puedo encontrar nada más específico para su tarea ).

Editar Cómo podría dudar de ello, hay, por supuesto, es un paquete de punto de referencia para R: rbenchmark. Aparentemente envuelve system.time()lo que también podría usar directamente. O eche un vistazo a esto, un simple par de funciones de cronómetro. También vea "Ejecutar un comando del sistema" @Rosetta Code (o no, es system("command")).

Edit2 Acabo de ver esta pregunta, "Medir el tiempo dentro de un script" en la columna "Relacionada" de la derecha, esto también se podría usar, es decir, tomar tiempo, hacer for-loop ( Ntiempos), tomar tiempo nuevamente, calcular el intervalo de tiempo, dividir por N. (Aún más fácil, intente time ( for-loop ), analice su salida, divida por N).


3

Puede usar Rpara calcular rápidamente la media, la desviación estándar y otros valores interesantes.

Por ejemplo, puede usar el tiempo GNU para escribir varias mediciones de tiempo de ejecución en un archivo 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
}

Entonces puede generar los valores con R así:

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

He creado un pequeño script de referencia que también hace una impresión bonita de la salida R, por ejemplo:

$ 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

Opción 1 - sqlite :

cree una tabla simple con columnas de comando y tiempo, y visualice con los cálculos de agregación adecuados . Después del tiempo, agregue una fila a la tabla.

Ventajas: más simple para definir una tabla en comparación con la solución 2.

Desventajas: necesita (¿le importa?) Preocuparse por la retención de datos.

Opción 2 - rrdtool :

Defina el archivo de base de datos rrd, la definición de datos y las funciones de agregación. Después del tiempo, alimente la base de datos con rrdtool update ....

Ventajas: puede generar fácilmente gráficos con rrdtool graph .... No hay problema de retención de datos (base de datos round robin).

Desventajas: un poco más difícil de definir la base de datos rrd en comparación con una simple tabla / vista SQL


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.