Slik bruker du tidskommandoen på Linux

Vil du vite hvor lenge en prosess varer og mye mer? Linux-tidskommandoen returnerer tidsstatistikk, og gir deg kul innsikt i ressursene som brukes av programmene dine.

tiden har mange slektninger

Det er mange Linux-distribusjoner og forskjellige Unix-lignende operativsystemer. Hver av disse har et standard kommandoskall. Det vanligste standardskallet i moderne Linux-distribusjoner er bash-skallet. Men det er mange andre, for eksempel Z-skallet (zsh) og Korn-skallet (ksh).

Alle disse skjellene inneholder sin egen tidskommando, enten som en innebygd kommando eller som en reservert ord. Når du skriver inn tid i et terminalvindu, vil skallet utføre sin interne kommando i stedet for å bruke GNU time binær som er gitt som en del av Linux-distribusjonen.

Vi ønsker å bruke GNU-versjonen av tid fordi den har mer alternativer og er mer fleksibel.

Hvilken tid vil løpe?

Du kan sjekke hvilken versjon som kjører ved å bruke type-kommandoen. type vil fortelle deg om skallet vil håndtere instruksjonen din selv, med sine interne rutiner, eller sende den videre til GNU-binæren.

i et terminalvindu skriv inn ordtypen, et mellomrom og deretter ordet tid og trykk Enter.

type time

Vi kan se at i bash-skallet er tid et reservert ord. Dette betyr at Bash vil bruke sine interne tidsrutiner som standard.

type time

I Z-skallet (zsh) er tid et reservert ord, så de interne skallrutinene vil bli brukt som standard.

type time

I Korn-skallet er tid et nøkkelord. En intern rutine vil bli brukt i stedet for GNU-tidskommandoen.

Kjører GNU-tidskommandoen

Hvis skallet på Linux-systemet ditt har en intern tidsrutine, må du være eksplisitt hvis du ønsker å bruke GNU-tidsbinæren. Du må enten:

Oppgi hele banen til binæren, for eksempel /usr/bin/time. Kjør hvilken tid-kommandoen for å finne denne banen.
Bruk kommandotid.
Bruk en skråstrek som tid.

Hvilken tid-kommandoen gir oss veien til binæren.

  Hvordan spille Super Flight på Linux

Vi kan teste dette ved å bruke /usr/bin/time som en kommando for å starte GNU-binæren. Det fungerer. Vi får et svar fra tidskommandoen som forteller oss at vi ikke oppga noen kommandolinjeparametere for den å fungere på.

Å skrive kommandotid fungerer også, og vi får samme bruksinformasjon fra tid til annen. Kommandokommandoen forteller skallet å ignorere den neste kommandoen slik at den behandles utenfor skallet.

Å bruke et tegn før kommandonavnet er det samme som å bruke kommando før kommandonavnet.

Den enkleste måten å sikre at du bruker GNU-tidsbinæren er å bruke omvendt skråstrek.

time
time

tid påkaller shell-versjonen av tid. tid bruker tiden binær.

Bruke tidskommandoen

La oss time noen programmer. Vi bruker to programmer kalt loop1 og loop2. De ble laget fra loop1.c og loop2.c. De gjør ikke noe nyttig bortsett fra å demonstrere effektene av en type koding ineffektivitet.

Dette er loop1.c. Lengden på en streng kreves innenfor de to nestede løkkene. Lengden er oppnådd på forhånd, utenfor de to nestede løkkene.

#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

La oss nå gjøre det samme for loop2.

time ./loop2

Det har gitt oss to sett med resultater, men de er i et veldig stygt format. Vi kan gjøre noe med det senere, men la oss plukke ut noen informasjonsbiter fra resultatene.

Når programmer kjører, er det to utførelsesmoduser som de byttes frem og tilbake mellom. Disse kalles brukermodus og kjernemodus.

Kort sagt, en prosess i brukermodus kan ikke få direkte tilgang til maskinvare eller referanseminne utenfor sin egen allokering. For å få tilgang til slike ressurser, må prosessen gjøre forespørsler til kjernen. Hvis kjernen godkjenner forespørselen, går prosessen inn i kjernemodusutførelse til kravet er tilfredsstilt. Prosessen byttes deretter tilbake til kjøring av brukermodus.

Resultatene for loop1 forteller oss at loop1 brukte 0,09 sekunder i brukermodus. Den brukte enten null tid i kjernemodus, eller tiden i kjernemodus er for lav verdi til å registreres når den har blitt rundet ned. Totalt medgått tid var 0,1 sekunder. loop1 ble tildelt et gjennomsnitt på 89 % av CPU-tiden i løpet av den totale medgåtte tiden.

Det ineffektive loop2-programmet tok tre ganger lengre tid å utføre. Den totale medgåtte tiden er 0,3 sekunder. Varigheten av behandlingstiden i brukermodus er 0,29 sekunder. Ingenting registreres for kjernemodus. loop2 ble tildelt et gjennomsnitt på 96 % av CPU-tiden under kjøringen.

Formatering av utdata

Du kan tilpasse utdataene fra tid til annen ved å bruke en formatstreng. Formatstrengen kan inneholde tekst og formatspesifikasjoner. Listen over formatspesifikasjoner kan være funnet på man-siden for tid. Hver av formatspesifikasjonene representerer et stykke informasjon.

Når strengen skrives ut, erstattes formatspesifikasjonene med de faktiske verdiene de representerer. For eksempel er formatspesifikasjonen for prosentandelen av CPU bokstaven P . For å indikere at en formatspesifikasjoner ikke bare er en vanlig bokstav, legg til et prosenttegn, som %P . La oss bruke det i et eksempel.

Alternativet -f (formatstreng) brukes til å fortelle tiden at det som følger er en formatstreng.

Formatstrengen vår kommer til å skrive ut tegnene "Program:" og navnet på programmet (og eventuelle kommandolinjeparametere som du sender til programmet). %C-formatspesifikasjonen står for "Navn og kommandolinjeargumenter for kommandoen som blir tidsbestemt". n får utgangen til å flytte til neste linje.

Det er mange formatspesifikasjoner, og de skiller mellom store og små bokstaver, så sørg for at du skriver dem inn riktig når du gjør dette for deg selv.

Deretter skal vi skrive ut tegnene "Total tid: " etterfulgt av verdien av den totale medgåtte tiden for denne kjøringen av programmet (representert av %E).

Vi bruker n for å gi en ny linje. Vi vil deretter skrive ut tegnene "Brukermodus(er) ", etterfulgt av verdien av CPU-tiden brukt i brukermodus, betegnet med %U.

Vi bruker n for å gi en ny linje. Denne gangen forbereder vi oss på kjernetidsverdien. Vi skriver ut tegnene "Kernel Mode (s) ", etterfulgt av formatspesifikasjonen for CPU-tid brukt i kjernemodus, som er %S.

Til slutt skal vi skrive ut tegnene "nCPU: " for å gi oss en ny linje og tittelen for denne dataverdien. %P-formatspesifikasjonen vil gi den gjennomsnittlige prosentandelen av CPU-tiden brukt av den tidsstyrte prosessen.

Hele formatstrengen er pakket inn i anførselstegn. Vi kunne ha inkludert noen t tegn for å plassere tabulatorer i utdataene hvis vi var masete med justeringen av verdiene.

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

Sende utdata til en fil

For å holde oversikt over tidspunktene fra testene du har utført, kan du sende utdataene fra tid til annen til en fil. For å gjøre dette, bruk alternativet -o (utdata). Utdataene fra programmet vil fortsatt vises i terminalvinduet. Det er kun utdataene fra tiden som blir omdirigert til filen.

Vi kan kjøre testen på nytt og lagre utdataene til test_results.txt-filen 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

Programutgangen for loop1 vises i terminalvinduet, og resultatene fra tiden går til filen test_results.txt.

Hvis du vil fange neste sett med resultater i samme fil, må du bruke alternativet -a (legg til) 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 skal nå være tydelig hvorfor vi brukte %C-formatspesifikasjonen for å inkludere navnet på programmet i utdataene fra formatstrengen.

Og vi er ute av tid

Sannsynligvis mest nytte for programmerere og utviklere for å finjustere koden deres, tidskommandoen er også nyttig for alle som ønsker å oppdage litt mer om hva som foregår under panseret hver gang du starter et program.