Wie werden Zeitbefehle gemittelt?


18

Ich timeführe einige meiner Befehle aus. Um die Kennzahlen zu mitteln, möchte ich meine Befehle eine festgelegte Anzahl ausführen und zeitlich festlegen und die Ergebnisse mit einem berechneten Mittelwert und einer Standardabweichung erhalten. Das Ergebnis wäre wie folgt:

avgtime -n 100 my_command

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

Gibt es ein UNIX-Tool dafür? Hat GNU / Linux eine?

Antworten:


7

Sie können versuchen, das timeit-Modul zu verwenden, das in jedem System mit Python verfügbar ist:

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

using os.system(), verursacht den Overhead beim Aufrufen / Erstellen einer Shell mit jedem Befehl. Verwenden Sie wahrscheinlich besser subprocess.call ()
Anthon

wahr, würde aber wahrscheinlich konstanter ish sowieso
bhdnx

4

Es ist nicht gerade ein UNIX- oder GNU / Linux-Tool, aber Sie können die R- Softwareumgebung für statistische Berechnungen ganz bequem dafür verwenden . (Ich kann jedoch nichts Spezifischeres für Ihre Aufgabe finden .)

Bearbeiten Wie könnte ich bezweifle es, es natürlich ist ein Benchmark - Paket für R: rbenchmark. Es wickelt sich anscheinend system.time()was man auch einfach direkt benutzen könnte. Oder werfen Sie einen Blick auf dieses einfache Stoppuhr-Funktionspaar. Siehe auch "Ausführen eines Systembefehls" @Rosetta Code (oder nicht, es ist system("command").)

Edit2 Ich habe gerade die Frage "Messen der Zeit innerhalb eines Skripts" in der rechten Spalte "Verwandte" gesehen, dies könnte auch verwendet werden, dh nimm dir Zeit, mache eine for-Schleife ( NZeiten), nimm dir wieder Zeit, berechne die Zeitspanne, dividiere durch N. (Noch einfacher, versuchen Sie es time ( for-loop ), analysieren Sie die Ausgabe, dividieren Sie durch N).


3

Mit können Sie Rschnell den Mittelwert, die Standardabweichung und andere interessante Werte berechnen.

Sie können beispielsweise GNU-Zeit verwenden, um mehrere Laufzeitmessungen in eine CSV-Datei zu schreiben:

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
}

Dann können Sie die Werte mit R wie folgt erzeugen:

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

Ich habe ein kleines Benchmark-Skript erstellt , das auch einige hübsche Ausdrucke der R-Ausgabe macht, zB:

$ 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

Option 1 - sqlite :

Erstellen Sie eine einfache Tabelle mit Befehls- und Zeitspalten und zeigen Sie sie mit geeigneten Aggregationsberechnungen an . Fügen Sie nach dem Timing der Tabelle eine Zeile hinzu .

Vorteile: Einfachere Definition einer Tabelle als bei Lösung 2.

Nachteile: Sie müssen sich um die Vorratsdatenspeicherung kümmern.

Option 2 - rrdtool :

Definieren Sie rrd Datenbankdatei, Datendefinitions- und Aggregationsfunktionen. Füttern Sie die Datenbank nach dem Timing mit rrdtool update ....

Vorteile: Mit können Sie ganz einfach Grafiken erstellen rrdtool graph .... Kein Problem bei der Vorratsdatenspeicherung (Round-Robin-Datenbank).

Nachteile: rrd-Datenbank ist etwas schwieriger zu definieren als einfache SQL-Tabelle / -Ansicht


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.