MC, 00:58 niedziela, 01.07.2012 r.
Ilustracja do artykułu: Linux time — Jak zmierzyć czas działania programu (real, user, sys)

Linux time — Jak zmierzyć czas działania programu (real, user, sys)

Artykuł ten chciałbym poświęcić na krótki opis polecenia time, które pozwala nam sprawdzić czas działania programu. Postaram się również, przybliżyć nieco co oznacza czas real, user oraz sys, czyli jak tak naprawdę należy interpretować rezultaty tego polecenia.

Po co sprawdzać czas działania programu?

Kontrola czasu pracy pewnych procesów, może służyć różnym celom. Dajmy na to, chcemy rozwiązać jakiś problem na dwa sposoby i nie wiemy, który z nich wybrać. Można wtedy wykonać prosty test mierzący czas potrzeby na wykonanie zadania przez każdy ze sposobów i w wyniku tego wybrać podejście wydajniejsze. Podobna sytuacja może mieć miejsce podczas oceny wydajności pewnych algorytmów, czy choćby porównawczych testów sprzętowych.

Jak zmierzyć czas działania programu?

Aby zmierzyć czas działania procesu, wystarczy uruchomić go z pozycji konsoli poprzedzając jego wywołanie poleceniem time. Oto prosty przykład:
$ time ls
bin    dev   initrd.img      lost+found  opt   sbin     sys  var
boot   etc   initrd.img.old  media       proc  selinux  tmp  vmlinuz
cdrom  home  lib             mnt         root  srv      usr  vmlinuz.old

real	0m0.005s
user	0m0.004s
sys	0m0.000s
$ time ls -Fs
razem 88
 4 bin/     4 home/             4 media/   4 sbin/      4 usr/
 4 boot/    0 initrd.img@       4 mnt/     4 selinux/   4 var/
 4 cdrom/   0 initrd.img.old@   4 opt/     4 srv/       0 vmlinuz@
 0 dev/     4 lib/              0 proc/    0 sys/       0 vmlinuz.old@
12 etc/    16 lost+found/       4 root/    4 tmp/

real	0m0.013s
user	0m0.012s
sys	0m0.000s

Jak widzimy, wydaliśmy dwukrotnie polecenie ls, tylko raz z parametrami, a raz nie. Czasy pracy tych dwóch procesów różnią się od siebie.

Dobrze, ale czym jest czas real, user oraz sys?

Polecenie time zwraca nam trzy różne czasy: real, user, a także czas sys. Aby móc cokolwiek powiedzieć na temat czasu pracy programu, należy potrafić interpretować te wyniki. Otóż czasy te oznaczają:
  • Real — czas, jaki musieliśmy odczekać od momentu włączenia procesu, do momentu zakończenia go (/zobaczenia jego wyników).
  • User — czas poświęcony na pracę procesora "wewnątrz procesu" (tzw. user-mode)
  • Sys — czas poświęcony przez procesor na komunikację z jądrem systemu (praca "na zewnątrz procesu").

Jakie z tego płyną wnioski?

Jak teraz nietrudno się domyślić, suma czasów user oraz sys, da nam całkowity czas pracy procesora nad danym programem. Dlaczego więc rzeczywisty czas, jaki musieliśmy odczekać, różni się od tego, jaki potrzebował procesor? Odpowiedź jest prosta. Gdyby procesor zajmował się tylko i wyłącznie tym jednym programem to czas real = user + sys, ale tak nie jest. Procesor musiał obsłużyć wiele innych działających procesów, dlatego jego praca była kolejkowana i czas real uwzględnia również czas oczekiwania w kolejce procesów.

Mając, choć powierzchowną wiedzę na temat tego, co te poszczególne czasy oznaczają, możemy w bardziej świadomy sposób podchodzić do rezultatów otrzymywanych za pomocą polecenia time.

Komentarze (2)

Imię:
Treść:
Yogi_ 2019-08-04 18:45:59
Nawiązując przy okazji do wpisu o generowaniu haseł: krzysiek@Dom2 ~ $ time egrep -aio -m 5 "[a-z0-9\!\@\#\$\%\^\&\*]{10}" /dev/urandom vqdzk6dV&m Jr@x@c#5LR L!T%y6NV3g hWJp&@5tG3 U^Aon0zqV* real 0m1.576s user 0m1.459s sys 0m0.060s krzysiek@Dom2 ~ $ time egrep -aio -m 5 "[a-z0-9\!\@\#\$\%\^\&\*]{15}" /dev/urandom @KZ#PvaYQ5D0ŃJ2 &ilx%zt9Z*7Yvun eUŦGa%bUf@qSACb b75P8KeGVK&XXgH QvKERQ5yqei7rq2 real 6m44.566s user 6m34.823s sys 0m7.973s Ten sposób przy dłuższych hasłach żre :( .
sinus 2018-07-04 16:39:23
real ≈ user + sys to się sprawdza tylko na jednordzeniowych procesorach. Ja dzisiaj np. na 4 rdzeniach uzyksłem taki wynik: real 0m56,406s user 2m30,235s sys 0m3,580s