Come si comandano i tempi medi?


18

Sto timeeseguendo alcuni dei miei comandi. Ora per calcolare la media delle misure, vorrei eseguire i tempi dei miei comandi per un determinato numero di volte e ottenere i risultati con una media calcolata e una deviazione standard. Il risultato sarebbe come:

avgtime -n 100 my_command

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

Esiste uno strumento UNIX per questo? GNU / Linux ne ha uno?

Risposte:


7

Puoi provare a utilizzare il modulo timeit, disponibile in qualsiasi sistema con Python:

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

usando os.system(), provoca l'overhead di chiamare / creare una shell con ogni comando. Probabilmente è meglio usare subprocess.call ()
Anthon,

vero, ma sarebbe probabilmente costante-ish comunque
bhdnx

4

Non è esattamente uno strumento UNIX o GNU / Linux, ma potresti tranquillamente usare l' ambiente software R per il calcolo statistico per questo. (Non riesco a trovare nulla di più specifico per il tuo compito, però .)

Edit Come potevo dubitarne, c'è, naturalmente, è un pacchetto di punto di riferimento per R: rbenchmark. Apparentemente avvolge system.time()che potresti anche usare direttamente. O dai un'occhiata a questo, una semplice coppia di funzioni del cronometro. Vedi anche "Esecuzione di un comando di sistema" @Rosetta Code (o no, lo è system("command").)

Edit2 Ho appena visto questa domanda, "Misurare il tempo all'interno di uno script" nella colonna "Correlata" a destra, anche questo potrebbe essere usato, ovvero prendere tempo, fare for-loop ( Ntempi), prendere di nuovo tempo, calcolare i tempi, dividere per N. (Ancora più semplice, prova time ( for-loop ), analizza il suo output, dividi per N).


3

È possibile utilizzare Rper calcolare rapidamente la media, la deviazione standard e altri valori interessanti.

Ad esempio, è possibile utilizzare il tempo GNU per scrivere diverse misure di runtime in un file 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
}

Quindi puoi generare i valori con R in questo modo:

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

Ho creato un piccolo script di benchmark che fa anche una bella stampa dell'output R, ad esempio:

$ 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

Opzione 1 - sqlite :

creare una tabella semplice con colonne di comando e tempo e visualizzare con i calcoli di aggregazione appropriati . Al termine, aggiungi una riga alla tabella.

Vantaggi: definizione più semplice di una tabella rispetto alla soluzione 2.

Svantaggi: hai bisogno (ti preoccupi?) Della conservazione dei dati.

Opzione 2 - rrdtool :

Definire il file di base di dati rrd, la definizione dei dati e le funzioni di aggregazione. Al termine, alimentare il database con rrdtool update ....

Vantaggi: puoi facilmente generare grafici con rrdtool graph .... Nessun problema di conservazione dei dati (database round robin).

Svantaggi: un po 'più difficile definire il database rrd rispetto alla semplice tabella / vista SQL


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.