Cum să utilizați comanda time pe Linux

Vrei să știi cât timp durează un proces și multe altele? Comanda de timp Linux returnează statistici de timp, oferindu-vă informații interesante asupra resurselor utilizate de programele dvs.

timpul are multe rude

Există multe distribuții Linux și diferite sisteme de operare asemănătoare Unix. Fiecare dintre acestea are un shell de comandă implicit. Cel mai comun shell implicit în distribuțiile moderne Linux este shell-ul bash. Dar există multe altele, cum ar fi shell-ul Z (zsh) și shell-ul Korn (ksh).

Toate aceste shell-uri încorporează propria lor comandă de timp, fie ca a incorporat comanda sau ca a cuvânt rezervat. Când tastați time într-o fereastră de terminal, shell-ul își va executa comanda internă în loc să folosească binarul de timp GNU care este furnizat ca parte a distribuției dvs. Linux.

Vrem să folosim versiunea GNU a timpului pentru că are mai multe Opțiuni si este mai flexibil.

La ce oră va alerga?

Puteți verifica ce versiune va rula folosind comanda type. type vă va informa dacă shell-ul va gestiona instrucțiunile dvs. în sine, cu rutinele sale interne, sau o va transmite binarului GNU.

într-o fereastră de terminal, tastați tipul cuvântului, un spațiu și apoi cuvântul oră și apăsați Enter.

type time

Putem vedea că în shell-ul bash, timpul este un cuvânt rezervat. Aceasta înseamnă că Bash își va folosi rutinele interne de timp în mod implicit.

type time

În shell-ul Z (zsh) timpul este un cuvânt rezervat, deci rutinele interne ale shell-ului vor fi utilizate implicit.

type time

În shell-ul Korn, timpul este un cuvânt cheie. O rutină internă va fi folosită în locul comenzii GNU time.

Rularea comenzii GNU time

Dacă shell-ul de pe sistemul dumneavoastră Linux are o rutină de timp internă, va trebui să fiți explicit dacă doriți să utilizați binarul de timp GNU. Trebuie fie:

Furnizați întreaga cale către binar, cum ar fi /usr/bin/time. Rulați comanda what time pentru a găsi această cale.
Utilizați timpul de comandă.
Folosește o bară oblică inversă ca timpul.

Comanda care timp ne oferă calea către binar.

Putem testa acest lucru folosind /usr/bin/time ca o comandă pentru a lansa binarul GNU. Asta merge. Primim un răspuns de la comanda time care ne spune că nu am furnizat niciun parametri pentru linia de comandă pentru ca aceasta să funcționeze.

Tastarea timpului de comandă funcționează, de asemenea, și obținem aceleași informații de utilizare din timp. Comanda de comandă îi spune shell-ului să ignore următoarea comandă, astfel încât să fie procesată în afara shell-ului.

Utilizarea unui caracter înaintea numelui comenzii este aceeași cu utilizarea unei comenzi înaintea numelui comenzii.

Cel mai simplu mod de a vă asigura că utilizați binarul de timp GNU este să utilizați opțiunea backslash.

time
time

timpul invocă versiunea shell a timpului. timpul folosește binarul timp.

Folosind comanda time

Să cronometram câteva programe. Folosim două programe numite bucla1 și bucla2. Au fost create din bucla1.c și bucla2.c. Ei nu fac nimic util în afară de a demonstra efectele unui tip de ineficiență de codare.

Aceasta este bucla1.c. Lungimea unui șir este necesară în cadrul celor două bucle imbricate. Lungimea se obține în avans, în afara celor două bucle imbricate.

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

int main (int argc, char* argv[])
{
 int i, j, len, count=0;
 char szString[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 // 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[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 for (j=0; j

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

time ./loop1

Acum să facem același lucru pentru bucla 2.

time ./loop2

Asta ne-a dat două seturi de rezultate, dar sunt într-un format cu adevărat urât. Putem face ceva în privința asta mai târziu, dar hai să alegem câteva informații din rezultate.

Când programele rulează, există două moduri de execuție între care sunt comutate înainte și înapoi. Acestea se numesc modul utilizator și modul kernel.

Pe scurt, un proces în modul utilizator nu poate accesa direct hardware-ul sau memoria de referință în afara propriei alocări. Pentru a avea acces la astfel de resurse, procesul trebuie să facă cereri către nucleu. Dacă nucleul aprobă cererea, procesul intră în execuția în modul kernel până când cerința este îndeplinită. Procesul este apoi comutat înapoi la execuția în modul utilizator.

Rezultatele pentru bucla1 ne spun că bucla1 a petrecut 0,09 secunde în modul utilizator. Fie a petrecut zero timp în modul kernel, fie timpul în modul kernel este o valoare prea mică pentru a fi înregistrată odată ce a fost rotunjit în jos. Timpul total scurs a fost de 0,1 secunde. loop1 a primit o medie de 89% din timpul CPU pe durata timpului său total scurs.

Programul ineficient loop2 a durat de trei ori mai mult pentru a fi executat. Timpul total scurs este de 0,3 secunde. Durata timpului de procesare în modul utilizator este de 0,29 secunde. Nu se înregistrează nimic pentru modul kernel. loop2 a primit o medie de 96% din timpul CPU pe durata rulării sale.

Formatarea ieșirii

Puteți personaliza rezultatul din timp folosind un șir de format. Șirul de format poate conține text și specificatori de format. Lista specificatorilor de format poate fi găsit pe pagina de manual pentru timp. Fiecare dintre specificatorii de format reprezintă o informație.

Când șirul este tipărit, specificatorii de format sunt înlocuiți cu valorile reale pe care le reprezintă. De exemplu, specificatorul de format pentru procentul CPU este litera P. Pentru a indica timpului că un specificator de format nu este doar o literă obișnuită, adăugați-i un semn procentual, cum ar fi %P . Să-l folosim într-un exemplu.

Opțiunea -f (șir de format) este folosită pentru a spune ora că ceea ce urmează este un șir de format.

Șirul nostru de format va tipări caracterele „Program: ” și numele programului (și orice parametri de linie de comandă pe care îi transmiteți programului). Specificatorul de format %C reprezintă „Numele și argumentele liniei de comandă ale comenzii care sunt cronometrate”. N face ca ieșirea să treacă la următoarea linie.

Există o mulțime de specificatori de formate și sunt sensibile la majuscule și minuscule, așa că asigurați-vă că le introduceți corect atunci când faceți acest lucru pentru dvs.

În continuare, vom tipări caracterele „Timp total: ” urmate de valoarea timpului total scurs pentru această rulare a programului (reprezentată de %E).

Folosim n pentru a da o altă linie nouă. Vom imprima apoi caracterele „User Mode(s)”, urmate de valoarea timpului CPU petrecut în modul utilizator, semnificată de %U.

Folosim n pentru a da o altă linie nouă. De data aceasta ne pregătim pentru valoarea timpului nucleului. Tipărim caracterele „Kernel Mode(s)”, urmate de specificatorul de format pentru timpul CPU petrecut în modul kernel, care este %S.

În cele din urmă, vom tipări caracterele „nCPU: ” pentru a ne oferi o nouă linie și titlul acestei valori de date. Specificatorul de format %P va oferi procentul mediu al timpului CPU utilizat de procesul temporizat.

Întregul șir de format este înfășurat între ghilimele. Am fi putut include câteva caractere t pentru a plasa file în ieșire dacă am fi fost agitați cu privire la alinierea valorilor.

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

Trimiterea ieșirii într-un fișier

Pentru a păstra o evidență a timpurilor din testele pe care le-ați efectuat, puteți trimite rezultatul din timp într-un fișier. Pentru a face acest lucru, utilizați opțiunea -o (ieșire). Ieșirea din programul dvs. se va afișa în continuare în fereastra terminalului. Doar rezultatul din timp este redirecționat către fișier.

Putem relua testul și salva rezultatul în fișierul test_results.txt, după cum urmează:

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

Ieșirea programului loop1 este afișată în fereastra terminalului și rezultatele din timp merg în fișierul test_results.txt.

Dacă doriți să capturați următorul set de rezultate în același fișier, trebuie să utilizați opțiunea -a (adăugați) după cum urmează:

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

Acum ar trebui să fie clar de ce am folosit specificatorul de format %C pentru a include numele programului în ieșirea din șirul de format.

Și am epuizat timpul

Probabil cea mai folositoare programatorilor și dezvoltatorilor pentru reglarea fină a codului lor, comanda time este utilă și pentru oricine dorește să descopere ceva mai multe despre ce se întâmplă sub capotă de fiecare dată când lansați un program.