Sådan bruger du tidskommandoen på Linux

Vil du vide, hvor længe en proces løber og meget mere? Linux-tidskommandoen returnerer tidsstatistikker, hvilket giver dig cool indsigt i de ressourcer, der bruges af dine programmer.

tiden har mange slægtninge

Der er mange Linux-distributioner og forskellige Unix-lignende operativsystemer. Hver af disse har en standard kommandoskal. Den mest almindelige standardskal i moderne Linux-distributioner er bash-skallen. Men der er mange andre, såsom Z-skallen (zsh) og Korn-skallen (ksh).

Alle disse skaller inkorporerer deres egen tidskommando, enten som en indbygget kommando eller som en reserveret ord. Når du indtaster tid i et terminalvindue, udfører skallen sin interne kommando i stedet for at bruge GNU time binær, som leveres som en del af din Linux-distribution.

Vi ønsker at bruge GNU-versionen af ​​tid, fordi den har mere muligheder og er mere fleksibel.

Hvilken tid vil køre?

Du kan kontrollere, hvilken version der kører ved at bruge type-kommandoen. type vil lade dig vide, om skallen vil håndtere din instruktion selv, med dens interne rutiner, eller videregive den til GNU-binæren.

Skriv ordtypen, et mellemrum og derefter ordet tid i et terminalvindue, og tryk på Enter.

type time

Vi kan se, at i bash-skallen er tid et reserveret ord. Dette betyder, at Bash som standard vil bruge sine interne tidsrutiner.

type time

I Z-skallen (zsh) er tid et reserveret ord, så de interne shell-rutiner vil blive brugt som standard.

type time

I Korn-skallen er tid et nøgleord. En intern rutine vil blive brugt i stedet for GNU-tidskommandoen.

Kører GNU Time Command

Hvis skallen på dit Linux-system har en intern tidsrutine, skal du være eksplicit, hvis du ønsker at bruge GNU time binær. Du skal enten:

Angiv hele stien til det binære, såsom /usr/bin/time. Kør hvilken tid-kommandoen for at finde denne sti.
Brug kommandotid.
Brug et skråstreg som tiden.

Hvilken tid-kommandoen giver os stien til det binære.

  Sådan installeres Delft-ikontemaet i Linux

Vi kan teste dette ved at bruge /usr/bin/time som en kommando til at starte GNU-binæren. Det virker. Vi får et svar fra tidskommandoen, der fortæller os, at vi ikke har angivet nogen kommandolinjeparametre, som den kan arbejde på.

Indtastning af kommandotid fungerer også, og vi får de samme brugsoplysninger fra tiden. Kommandokommandoen fortæller skallen at ignorere den næste kommando, så den behandles uden for skallen.

Brug af et tegn før kommandonavnet er det samme som at bruge kommando før kommandonavnet.

Den enkleste måde at sikre, at du bruger GNU time binær er at bruge backslash muligheden.

time
time

tid påberåber sig shell-versionen af ​​tid. tid bruger tiden binær.

Brug af tidskommandoen

Lad os tid nogle programmer. Vi bruger to programmer kaldet loop1 og loop2. De blev skabt ud fra loop1.c og loop2.c. De gør ikke noget nyttigt bortset fra at demonstrere virkningerne af en type kodningsineffektivitet.

Dette er loop1.c. Længden af ​​en streng er påkrævet inden for de to indlejrede løkker. Længden er opnået på forhånd, uden for de to indlejrede løkker.

#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

Lad os nu gøre det samme for loop2.

time ./loop2

Det har givet os to sæt resultater, men de er i et virkelig grimt format. Vi kan gøre noget ved det senere, men lad os udvælge et par stykker information ud af resultaterne.

Når programmer kører, er der to udførelsestilstande, som de skiftes frem og tilbage mellem. Disse kaldes brugertilstand og kernetilstand.

Kort sagt kan en proces i brugertilstand ikke direkte få adgang til hardware eller referencehukommelse uden for sin egen allokering. For at få adgang til sådanne ressourcer skal processen lave anmodninger til kernen. Hvis kernen godkender anmodningen, går processen i kernetilstand, indtil kravet er opfyldt. Processen skiftes derefter tilbage til udførelse af brugertilstand.

Resultaterne for loop1 fortæller os, at loop1 brugte 0,09 sekunder i brugertilstand. Den brugte enten nul tid i kernetilstand, eller tiden i kernetilstand er en for lav værdi til at registrere, når den er blevet rundet ned. Den samlede forløbne tid var 0,1 sekunder. loop1 blev tildelt et gennemsnit på 89 % af CPU-tiden over varigheden af ​​dens samlede forløbne tid.

Det ineffektive loop2-program tog tre gange længere tid at udføre. Dens samlede forløbne tid er 0,3 sekunder. Varigheden af ​​behandlingstiden i brugertilstand er 0,29 sekunder. Der registreres ikke noget for kernetilstand. loop2 blev tildelt et gennemsnit på 96 % af CPU-tiden i løbet af dens kørsel.

Formatering af output

Du kan tilpasse output fra tid til anden ved hjælp af en formatstreng. Formatstrengen kan indeholde tekst og formatangivelser. Listen over formatspecifikationer kan være findes på man-siden for tid. Hver af formatspecifikationerne repræsenterer et stykke information.

Når strengen udskrives, erstattes formatspecifikationerne med de faktiske værdier, de repræsenterer. For eksempel er formatspecifikationen for procentdelen af ​​CPU bogstavet P . For at indikere, at en formatangiver ikke bare er et almindeligt bogstav, skal du tilføje et procenttegn til det, som %P . Lad os bruge det som et eksempel.

Indstillingen -f (formatstreng) bruges til at fortælle tiden, at det følgende er en formatstreng.

Vores formatstreng vil udskrive tegnene "Program: " og navnet på programmet (og eventuelle kommandolinjeparametre, som du sender til programmet). %C-formatspecifikationen står for "Navn og kommandolinjeargumenter for den kommando, der tidsindstilles". n'et får output til at flytte til næste linje.

Der er mange formatspecifikationer, og de skelner mellem store og små bogstaver, så sørg for, at du indtaster dem korrekt, når du gør dette for jer selv.

Dernæst skal vi udskrive tegnene "Total tid: " efterfulgt af værdien af ​​den samlede forløbne tid for denne kørsel af programmet (repræsenteret ved %E).

Vi bruger n til at give endnu en ny linje. Vi udskriver derefter tegnene "Brugertilstand(er) ", efterfulgt af værdien af ​​CPU-tiden brugt i brugertilstand, angivet med %U.

Vi bruger n til at give endnu en ny linje. Denne gang forbereder vi kernetidsværdien. Vi udskriver tegnene "Kernel Mode (s) ", efterfulgt af formatspecifikationen for CPU-tid brugt i kernetilstand, som er %S.

Til sidst vil vi udskrive tegnene "nCPU: " for at give os en ny linje og titlen for denne dataværdi. %P-formatspecifikationen vil give den gennemsnitlige procentdel af CPU-tid, der bruges af den tidsindstillede proces.

Hele formatstrengen er pakket ind i anførselstegn. Vi kunne have inkluderet nogle t tegn til at placere tabulatorer i outputtet, hvis vi var nøjeregnende med justeringen af ​​værdierne.

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

Afsendelse af output til en fil

For at holde et register over tiderne fra de test, du har udført, kan du sende output fra tid til anden til en fil. For at gøre dette skal du bruge -o (output) muligheden. Outputtet fra dit program vil stadig blive vist i terminalvinduet. Det er kun output fra tid, der omdirigeres til filen.

Vi kan køre testen igen og gemme outputtet i filen test_results.txt som følger:

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

Udgangen af ​​loop1-programmet vises i terminalvinduet, og resultaterne fra tiden går til filen test_results.txt.

Hvis du vil fange det næste sæt resultater i den samme fil, skal du bruge -a (tilføj) muligheden som følger:

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

Det skulle nu være tydeligt, hvorfor vi brugte %C-formatspecifikationen til at inkludere navnet på programmet i outputtet fra formatstrengen.

Og vi er ude af tiden

Tidskommandoen er nok mest nyttig for programmører og udviklere til at finjustere deres kode, men tidskommandoen er også nyttig for alle, der ønsker at opdage lidt mere om, hvad der foregår under motorhjelmen, hver gang du starter et program.