Az időparancs használata Linuxon

Szeretné tudni, hogy mennyi ideig tart egy folyamat, és még sok minden mást? A Linux time parancs időstatisztikát ad vissza, így remek betekintést nyújt a programok által használt erőforrásokba.

az időnek sok rokona van

Számos Linux disztribúció és különféle Unix-szerű operációs rendszer létezik. Ezek mindegyikéhez tartozik egy alapértelmezett parancshéj. A modern Linux disztribúciók leggyakoribb alapértelmezett shellje a bash shell. De sok más is létezik, például a Z shell (zsh) és a Korn shell (ksh).

Mindezek a héjak saját időparancsot tartalmaznak, akár a beépített parancs vagy mint a fenntartott szó. Amikor beírja az időt egy terminálablakba, a shell a belső parancsát hajtja végre, ahelyett, hogy a Linux disztribúció részeként biztosított GNU time binárist használná.

Az idő GNU verzióját akarjuk használni, mert több van benne opciók és rugalmasabb.

Mikor fog futni?

A type paranccsal ellenőrizheti, hogy melyik verzió fut. A típus jelzi, hogy a shell maga kezeli-e az utasításokat a belső rutinjaival együtt, vagy továbbítja a GNU binárisnak.

egy terminálablakba írja be a szótípust, egy szóközt, majd az időt, és nyomja meg az Enter billentyűt.

type time

Láthatjuk, hogy a bash shellben az idő fenntartott szó. Ez azt jelenti, hogy a Bash alapértelmezés szerint a belső idő rutinjait fogja használni.

type time

A Z shellben (zsh) az idő lefoglalt szó, így alapértelmezés szerint a belső shell-rutinok lesznek használatban.

type time

A Korn shellben az idő kulcsszó. A GNU time parancs helyett egy belső rutin kerül felhasználásra.

A GNU time Command futtatása

Ha a Linux rendszeren lévő shell rendelkezik belső időrutinnal, akkor egyértelműnek kell lennie, ha a GNU idő binárist szeretné használni. A következőket kell tennie:

Adja meg a bináris fájl teljes elérési útját, például /usr/bin/time. Futtassa a which time parancsot az elérési út megkereséséhez.
Használja a parancsidőt.
Használjon fordított perjelet, mint az idő.

  A Szerkesztői csevegés használata a Google Dokumentumokban

A what time parancs megadja a binárishoz vezető utat.

Ezt úgy tesztelhetjük, hogy a /usr/bin/time parancsot használjuk a GNU bináris elindításához. Működik. Azt a választ kapjuk a time parancstól, hogy nem adtunk meg parancssori paramétereket a működéséhez.

A parancsidő beírása is működik, és időről időre ugyanazokat a használati információkat kapjuk. A parancs parancs arra utasítja a parancsértelmezőt, hogy figyelmen kívül hagyja a következő parancsot, így az a shell-en kívül kerül feldolgozásra.

Karakter használata a parancs neve előtt ugyanaz, mint a parancs használata a parancs neve előtt.

A legegyszerűbb módja annak, hogy megbizonyosodjon arról, hogy a GNU idő binárist használja, a fordított perjel opció használata.

time
time

Az idő az idő shell verzióját hívja meg. az idő az idő binárist használja.

Az időparancs használata

Időzítsünk néhány programot. Két programot használunk, a ciklus1-et és a loop2-t. A loop1.c-ből és a loop2.c-ből készültek. Semmi hasznosat nem tesznek azon kívül, hogy demonstrálják egyfajta kódolási elégtelenség hatását.

Ez a loop1.c. A karakterlánc hossza szükséges a két egymásba ágyazott hurkon belül. A hosszt előre megkapjuk, a két egymásba ágyazott hurkon kívül.

#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

Most tegyük ugyanezt a loop2 esetében is.

time ./loop2

Ezzel két eredményt kaptunk, de ezek nagyon csúnya formátumban vannak. Később tehetünk ez ellen, de válasszunk ki néhány információt az eredményekből.

Amikor a programok futnak, két végrehajtási mód van, amelyek között oda-vissza váltanak. Ezeket felhasználói módnak és kernel módnak nevezzük.

Röviden: egy felhasználói módban lévő folyamat nem férhet hozzá közvetlenül a hardverhez vagy a referenciamemóriához a saját kiosztásán kívül. Az ilyen erőforrásokhoz való hozzáférés érdekében a folyamatnak kéréseket kell küldenie a kernelhez. Ha a kernel jóváhagyja a kérést, a folyamat kernel módú végrehajtásba lép, amíg a követelmény teljesül. A folyamat ezután visszakapcsol felhasználói módú végrehajtásra.

A loop1 eredményei azt mutatják, hogy a loop1 0,09 másodpercet töltött felhasználói módban. Vagy nulla időt töltött kernel módban, vagy a kernel módban töltött idő túl alacsony ahhoz, hogy lefelé kerekítés után regisztrálja magát. A teljes eltelt idő 0,1 másodperc volt. A loop1 átlagosan a CPU-idő 89%-át kapta a teljes eltelt ideje alatt.

A nem hatékony loop2 program végrehajtása háromszor hosszabb ideig tartott. A teljes eltelt ideje 0,3 másodperc. A feldolgozási idő felhasználói módban 0,29 másodperc. Semmi sem regisztrál a kernel módhoz. A loop2-nek átlagosan a CPU-idő 96%-át ítélték oda futásának időtartamára.

A kimenet formázása

A kimenetet időről időre testreszabhatja egy formátum karakterlánc segítségével. A formátum karakterlánc tartalmazhat szöveget és formátumspecifikációkat. A formátummeghatározók listája lehet a man oldalon található időre. A formátummeghatározók mindegyike egy-egy információt képvisel.

A karakterlánc kinyomtatása során a formátum-specifikátorokat az általuk képviselt tényleges értékek helyettesítik. Például a CPU százalékos arányának formátummeghatározója a P betű. Ha szeretné jelezni az időnek, hogy egy formátum-meghatározó nem csak egy szokásos betű, adjon hozzá egy százalékjelet, például: %P . Használjuk egy példában.

A -f (format string) opció arra szolgál, hogy jelezze az időt, hogy ami ezután következik, az egy formátum karakterlánc.

Formátumkarakterláncunk kiírja a „Program:” karaktereket és a program nevét (és a programnak átadott parancssori paramétereket). A %C formátumspecifikátor az „időzített parancs neve és parancssori argumentumai” rövidítése. Az n hatására a kimenet a következő sorba lép.

Sok formátum-specifikáció létezik, és ezek megkülönböztetik a kis- és nagybetűket, ezért ügyeljen arra, hogy helyesen adja meg őket, amikor ezt saját maga csinálja.

Ezután kiírjuk a „Teljes idő: ” karaktereket, majd a program ezen futásának teljes eltelt idő értékét (amelyet %E jelöl).

Az n-t használjuk egy újabb sor megadására. Ezután kinyomtatjuk a „Felhasználói mód(ok)” karaktereket, majd a felhasználói módban eltöltött CPU-idő értékét, amelyet a %U jelöl.

Az n-t használjuk egy újabb sor megadására. Ezúttal a kernel időértékére készülünk. Kinyomtatjuk a „Kernel Mode (s)” karaktereket, majd a kernel módban eltöltött CPU-idő formátum-specifikátorát, ami %S.

Végül kinyomtatjuk az „nCPU:” karaktereket, hogy új sort és címet kapjunk az adatértékhez. A %P formátum megadja az időzített folyamat által felhasznált CPU-idő átlagos százalékos arányát.

A teljes formátum karakterlánc idézőjelbe van csomagolva. Beilleszthettünk volna néhány t karaktert a tabulátorok elhelyezéséhez a kimenetben, ha az értékek igazításával foglalkozunk.

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

A kimenet elküldése fájlba

Az elvégzett tesztek időzítésének rögzítéséhez időnként elküldheti a kimenetet egy fájlba. Ehhez használja a -o (output) opciót. A program kimenete továbbra is megjelenik a terminál ablakában. Csak az időből származó kimenet kerül átirányításra a fájlba.

A tesztet újra lefuttathatjuk, és a kimenetet elmenthetjük a test_results.txt fájlba az alábbiak szerint:

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

A ciklus1 program kimenete megjelenik a terminál ablakban, és az eredmények időről időre a test_results.txt fájlba kerülnek.

Ha a következő eredményhalmazt ugyanabban a fájlban szeretné rögzíteni, az -a (hozzáfűzés) kapcsolót kell használnia az alábbiak szerint:

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

Most már nyilvánvaló, hogy miért használtuk a %C formátumspecifikátort, hogy a program nevét belefoglaljuk a formátum karakterlánc kimenetébe.

És lejárt az időnk

Valószínűleg a programozók és fejlesztők leginkább a kódjuk finomhangolására használhatók, a time parancs azoknak is hasznos, akik egy kicsit többet szeretnének megtudni arról, hogy mi történik a motorháztető alatt, valahányszor elindít egy programot.