Jak uśredniać czas poleceń?

18

Ja timeing niektóre z moich poleceń. Teraz, aby uśrednić miary, chciałbym uruchomić i określić czas moich poleceń określoną liczbę razy i uzyskać wyniki z obliczoną średnią i odchyleniem standardowym. Wynik byłby następujący:

avgtime -n 100 my_command

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

Czy istnieje do tego narzędzie UNIX? Czy GNU / Linux ma taki system?

Didier Trosset
źródło

Odpowiedzi:

7

Możesz spróbować użyć modułu timeit, dostępnego w dowolnym systemie z Pythonem:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop
bhdnx
źródło
użycie os.system()powoduje obciążenie związane z wywoływaniem / tworzeniem powłoki przy każdym poleceniu. Prawdopodobnie lepiej użyć subprocess.call ()
Anthon
prawda, ale i tak prawdopodobnie byłaby stała
bhdnx
4

Nie jest to do końca narzędzie UNIX lub GNU / Linux, ale można w tym celu całkiem wygodnie korzystać ze środowiska oprogramowania R do obliczeń statystycznych . (Nie mogę jednak znaleźć nic bardziej konkretnego dla twojego zadania .)

Edit Jak mogłem wątpić, że oczywiście jest to pakiet odniesienia dla R: rbenchmark. Najwyraźniej jest to opakowanie, system.time()którego można również użyć bezpośrednio. Lub spójrz na to, prosta para funkcji stopera. Zobacz także „Wykonywanie polecenia systemowego” @Rosetta Code (lub nie, to jest system("command").)

Edytuj2 Właśnie widziałem to pytanie „Mierzenie czasu w skrypcie” w prawej kolumnie „Powiązane”, można go również użyć, tj. Poświęć czas, wykonaj pętlę for-time ( Nczasy), poświęć czas ponownie, oblicz czas, podziel przez N. (Jeszcze łatwiej, spróbuj time ( for-loop )przeanalizować jego wynik, podzielić przez N).

sr_
źródło
3

Możesz użyć Rdo szybkiego obliczenia średniej, odchylenia standardowego i innych interesujących wartości.

Na przykład możesz użyć czasu GNU, aby zapisać kilka pomiarów czasu wykonywania w pliku 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
}

Następnie możesz wygenerować wartości z R w następujący sposób:

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

Stworzyłem mały skrypt testowy, który również ładnie drukuje dane wyjściowe R, np .:

$ 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
maxschlepzig
źródło
1

Opcja 1 - sqlite :

utwórz prostą tabelę z kolumnami poleceń i czasu oraz wyświetlaj z odpowiednimi obliczeniami agregacji . Po upływie czasu dodaj wiersz do tabeli.

Zalety: łatwiej jest zdefiniować tabelę w porównaniu do rozwiązania 2.

Wady: potrzebujesz (czy?) Dbania o zatrzymywanie danych.

Opcja 2 - rrdtool :

Zdefiniuj plik bazy danych rrd, funkcje definicji i agregacji danych. Po upływie czasu podaj bazę danych rrdtool update ....

Zalety: możesz łatwo generować wykresy rrdtool graph .... Brak problemu z zatrzymywaniem danych (baza danych Round Robin).

Wady: nieco trudniej zdefiniować bazę danych rrd w porównaniu do prostej tabeli / widoku SQL

Michał Šrajer
źródło