time

Mierzy czas rzeczywisty, użytkownika i systemowy wykonania polecenia.

time mierzy, jak długo trwa wykonanie dowolnego polecenia. Poprzedzasz nim komendę, a po jej zakończeniu dostajesz trzy liczby: czas rzeczywisty (ile minęło na zegarze), czas użytkownika (ile procesor spędził na kodzie programu) i czas systemowy (ile na wywołaniach jądra). To najprostsze narzędzie, gdy chcesz sprawdzić, czy skrypt zwalnia, porównać dwie wersje kodu albo zobaczyć, gdzie ucieka czas. Uwaga na start: time to najczęściej słowo kluczowe wbudowane w powłokę (bash, zsh), a nie osobny program — dlatego jego zachowanie zależy od tego, czego uruchamiasz.

Składnia i najważniejsze opcje

Podstawowo: time polecenie [argumenty]

Wersja wbudowana w bash ma tylko jedną istotną opcję (-p). Reszta flag należy do zewnętrznego programu /usr/bin/time z pakietu GNU time, który uruchomisz podając pełną ścieżkę albo pisząc \time.

  • -p — bashowe: wymusza przenośny format POSIX (linie real, user, sys w sekundach).
  • -v — GNU: tryb gadatliwy, pokazuje wszystko — pamięć, przełączenia kontekstu, page faults, operacje I/O.
  • -f FORMAT — GNU: własny format wyjścia, np. %e (czas rzeczywisty), %M (szczyt pamięci w KB), %P (procent CPU).
  • -o PLIK — GNU: zapisuje wynik do pliku zamiast na stderr.
  • -a — GNU: dopisuje do pliku z -o zamiast go nadpisywać.
  • --version — GNU: wersja programu (bashowy builtin jej nie ma).

Przykłady użycia

  • time sleep 2 — zmierzysz najprostszy przypadek; real będzie bliskie 2 s, a user i sys prawie zerowe (bo program tylko czeka).
  • time ./skrypt.sh — sprawdzisz, ile realnie trwa Twój skrypt bez dokładania stopera do kodu.
  • /usr/bin/time -v python3 trenuj.py — pełny raport zasobów: zobaczysz też szczytowe zużycie pamięci, przydatne przy podejrzeniu wycieków.
  • /usr/bin/time -f "%e s, pamięć %M KB" make — własny, zwięzły format z czasem i pamięcią w jednej linii.
  • time (curl -s example.com | wc -l) — nawiasy pakują cały potok w subpowłokę, więc zmierzysz go w całości.

Częste błędy i pułapki

Największa pomyłka to mylenie dwóch time. Flagi -v i -f należą do GNU /usr/bin/time, a nie do builtina — wywołane po prostu jako time -v w bashu dostaniesz błąd lub złe zachowanie. Gdy chcesz mieć pewność, że używasz zewnętrznego programu, pisz \time albo pełną ścieżkę.

Druga pułapka: potoki. Bashowy builtin ogarnia time cmd1 | cmd2 i mierzy cały ciąg, ale zewnętrzny /usr/bin/time zmierzy tylko pierwsze polecenie — dlatego potok zamykaj w nawiasach jak w przykładzie wyżej. Trzecia sprawa: na wielu minimalnych obrazach Docker pakiet time w ogóle nie jest zainstalowany, więc /usr/bin/time nie istnieje, choć builtin działa. I pamiętaj, że wynik ląduje na stderr, nie na stdout — jeśli chcesz go przechwycić, przekieruj 2>.

Powiązane komendy: times (statystyki czasu powłoki), timeout (ubicie polecenia po limicie), date (znaczniki czasu), strace i perf (głębszy profiling), htop (podgląd zasobów na żywo).