Jak używać polecenia czasu w systemie Linux

Chcesz wiedzieć, jak długo trwa proces i wiele więcej? Polecenie czasu Linuksa zwraca statystyki czasu, dając ciekawy wgląd w zasoby używane przez twoje programy.

czas ma wielu krewnych

Istnieje wiele dystrybucji Linuksa i różne systemy operacyjne podobne do Uniksa. Każdy z nich ma domyślną powłokę poleceń. Najpowszechniejszą domyślną powłoką w nowoczesnych dystrybucjach Linuksa jest powłoka bash. Ale istnieje wiele innych, takich jak powłoka Z (zsh) i powłoka Korna (ksh).

Wszystkie te powłoki zawierają własne polecenia czasu, jako plik wbudowany polecenie lub jako słowo zastrzeżone. Kiedy wpiszesz czas w oknie terminala, powłoka wykona swoje wewnętrzne polecenie zamiast używać binarnego czasu GNU, który jest dostarczany jako część twojej dystrybucji Linuksa.

Chcemy używać czasu w wersji GNU, ponieważ ma on więcej opcje i jest bardziej elastyczny.

Który czas będzie przebiegał?

Możesz sprawdzić, która wersja będzie działać, używając polecenia type. type da ci znać, czy powłoka sama obsłuży twoją instrukcję wraz ze swoimi wewnętrznymi procedurami, czy też przekaże ją do pliku binarnego GNU.

w oknie terminala wpisz typ słowa, spację, a następnie słowo czas i naciśnij Enter.

type time

wpisz czas w oknie terminala bash

Widzimy, że czas powłoki bash jest słowem zastrzeżonym. Oznacza to, że Bash domyślnie użyje swoich wewnętrznych procedur czasu.

type time

wpisz czas w oknie terminala zsh

W powłoce Z (zsh) czas jest słowem zastrzeżonym, więc wewnętrzne procedury powłoki będą używane domyślnie.

type time

wpisz czas w oknie powłoki Korna

W skorupie Korna czas jest słowem kluczowym. Zamiast polecenia czasu GNU zostanie użyta procedura wewnętrzna.

Uruchamianie polecenia GNU time

Jeśli powłoka w systemie Linux ma wewnętrzną procedurę czasową, musisz wyraźnie określić, czy chcesz używać binarnego czasu GNU. Musisz:

Podaj pełną ścieżkę do pliku binarnego, na przykład / usr / bin / time. Uruchom polecenie which time, aby znaleźć tę ścieżkę.
Użyj czasu poleceń.
Użyj odwrotnego ukośnika, jak czas.

wyjście polecenia time w oknie terminala

Polecenie which time daje nam ścieżkę do pliku binarnego.

Możemy to sprawdzić, używając / usr / bin / time jako polecenia do uruchomienia pliku binarnego GNU. To działa. Otrzymujemy odpowiedź z polecenia time, która mówi nam, że nie podaliśmy żadnych parametrów wiersza poleceń, nad którymi mógłby działać.

Czas wpisywania poleceń również działa i od czasu do czasu otrzymujemy te same informacje o użyciu. Polecenie polecenie mówi powłoce, aby zignorowała następne polecenie, aby zostało przetworzone poza powłoką.

Użycie znaku przed nazwą polecenia ma taki sam skutek, jak użycie polecenia przed nazwą polecenia.

Najprostszym sposobem upewnienia się, że używasz binarnego czasu GNU, jest użycie opcji odwrotnego ukośnika.

time
time

wyjście czasu i czasu w oknie terminala

czas wywołuje powłokową wersję czasu. czas używa czasu binarnego.

Korzystanie z polecenia czasu

Czas na kilka programów. Używamy dwóch programów o nazwach loop1 i loop2. Zostały utworzone z loop1.c i loop2.c. Nie robią nic pożytecznego poza wykazaniem skutków jednego rodzaju nieefektywności kodowania.

To jest loop1.c. Długość łańcucha jest wymagana w dwóch zagnieżdżonych pętlach. Długość jest określana z góry, poza dwiema zagnieżdżonymi pętlami.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, len, count=0;
 char szString[]="newsblog.pl-newsblog.pl-newsblog.pl-newsblog.pl-newsblog.pl-newsblog.pl";

 // get length of string once, outside of loops
 len = strlen( szString );  

 for (j=0; j

This is loop2.c. The length of the string is obtained time after time for every cycle of the outer loop. This inefficiency ought to show up in the timings.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, count=0;
 char szString[]="newsblog.pl-newsblog.pl-newsblog.pl-newsblog.pl-newsblog.pl-newsblog.pl";

 for (j=0; j

Let’s fire up the loop1 program and use time to measure its performance.

time ./loop1

wyniki czasowe dla pętli 1 w oknie terminala

Zróbmy teraz to samo dla loop2.

time ./loop2

wyjście czasowe dla pętli 2 w oknie terminala

To daje nam dwa zestawy wyników, ale są one w naprawdę brzydkim formacie. Możemy coś z tym zrobić później, ale weźmy kilka informacji z wyników.

Gdy programy są uruchamiane, istnieją dwa tryby wykonywania, między którymi są przełączane. Nazywa się to trybem użytkownika i trybem jądra.

Krótko mówiąc, proces w trybie użytkownika nie może uzyskać bezpośredniego dostępu do sprzętu lub pamięci referencyjnej poza własnym przydziałem. Aby uzyskać dostęp do takich zasobów, proces musi kierować żądania do jądra. Jeśli jądro zatwierdzi żądanie, proces przejdzie do wykonywania w trybie jądra, dopóki wymaganie nie zostanie spełnione. Proces jest następnie przełączany z powrotem do wykonywania w trybie użytkownika.

Wyniki loop1 mówią nam, że loop1 spędził 0,09 sekundy w trybie użytkownika. Spędził zero czasu w trybie jądra lub czas w trybie jądra jest wartością zbyt małą, aby można było ją zarejestrować po zaokrągleniu w dół. Całkowity czas, który upłynął, wyniósł 0,1 sekundy. loop1 otrzymywał średnio 89% czasu procesora w całym okresie, który upłynął.

Nieefektywny program loop2 wykonywał się trzy razy dłużej. Całkowity czas, który upłynął, to 0,3 sekundy. Czas przetwarzania w trybie użytkownika wynosi 0,29 sekundy. Nic nie rejestruje się w trybie jądra. loop2 otrzymywał średnio 96% czasu procesora na czas jego działania.

Formatowanie danych wyjściowych

Możesz dostosować dane wyjściowe od czasu, używając ciągu formatu. Ciąg formatu może zawierać tekst i specyfikatory formatu. Listą specyfikatorów formatu może być znaleźć na stronie podręcznika na czas. Każdy ze specyfikatorów formatu reprezentuje informację.

Gdy ciąg jest drukowany, specyfikatory formatu są zastępowane przez rzeczywiste wartości, które reprezentują. Na przykład specyfikatorem formatu procentowego wykorzystania procesora jest litera P. Aby wskazać czasowi, że specyfikator formatu nie jest zwykłą literą, dodaj do niego znak procentu, na przykład% P. Wykorzystajmy to na przykładzie.

Opcja -f (łańcuch formatujący) służy do określenia czasu, że to, co następuje, jest łańcuchem formatu.

Nasz ciąg formatu wypisze znaki „Program:” i nazwę programu (oraz wszelkie parametry wiersza poleceń, które przekazujesz do programu). Specyfikator formatu% C oznacza „Nazwa i argumenty wiersza polecenia polecenia, którego czas jest mierzony”. N powoduje przejście do następnego wiersza.

Istnieje wiele specyfikatorów formatów i uwzględniają wielkość liter, więc upewnij się, że wprowadzasz je poprawnie, robiąc to samodzielnie.

Następnie wydrukujemy znaki „Całkowity czas:”, a po nich wartość całkowitego czasu, jaki upłynął dla tego uruchomienia programu (reprezentowany przez% E).

Używamy n do podania kolejnej nowej linii. Następnie wydrukujemy znaki „Tryb (y) użytkownika”, a po nich wartość czasu procesora spędzonego w trybie użytkownika, oznaczony przez% U.

Używamy n do podania kolejnej nowej linii. Tym razem przygotowujemy się na wartość czasu jądra. Drukujemy znaki „Tryb (y) jądra”, po których następuje specyfikator formatu czasu procesora spędzonego w trybie jądra, czyli% S.

Na koniec wydrukujemy znaki „nCPU:”, aby uzyskać nowy wiersz i tytuł tej wartości danych. Specyfikator formatu% P podaje średni procent czasu procesora używanego przez proces czasowy.

Cały ciąg formatu jest zawinięty w cudzysłów. Moglibyśmy uwzględnić kilka znaków t, aby umieścić tabulatory w wynikach, gdybyśmy byli wybredni co do wyrównania wartości.

time -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1

Dane wyjściowe z ciągu formatu dla loop1 w oknie terminala

Wysyłanie wyniku do pliku

Aby zachować zapis czasów z przeprowadzonych testów, możesz od czasu do czasu przesyłać dane wyjściowe do pliku. Aby to zrobić, użyj opcji -o (wyjście). Dane wyjściowe twojego programu będą nadal wyświetlane w oknie terminala. Tylko dane wyjściowe z czasu są przekierowywane do pliku.

Możemy ponownie uruchomić test i zapisać wynik do pliku test_results.txt w następujący sposób:

time -o test_results.txt -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1
cat test_results.txt

Wyjście z ciągu formatu dla loop1 przesłane potokiem do pliku w oknie terminala

Wyjście programu loop1 jest wyświetlane w oknie terminala, a wyniki od czasu do czasu trafiają do pliku test_results.txt.

Jeśli chcesz przechwycić następny zestaw wyników w tym samym pliku, musisz użyć opcji -a (append) w następujący sposób:

time -o test_results.txt -a -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop2
cat test_results.txt

Dane wyjściowe z ciągu formatu dla loop2 dołączonego do pliku w oknie terminala

Powinno teraz być jasne, dlaczego użyliśmy specyfikatora formatu% C, aby dołączyć nazwę programu do danych wyjściowych z ciągu formatu.

I nie mamy czasu

Prawdopodobnie najczęściej używane przez programistów i programistów do dostrajania ich kodu, polecenie time jest również przydatne dla każdego, kto chce dowiedzieć się nieco więcej o tym, co dzieje się pod maską za każdym razem, gdy uruchamiasz program.