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.
Tartalomjegyzék
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 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; jThis 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; jLet’s fire up the loop1 program and use time to measure its performance.
time ./loop1Most tegyük ugyanezt a loop2 esetében is.
time ./loop2Ezzel 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" ./loop1A 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" ./loop1cat test_results.txtA 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" ./loop2cat test_results.txtMost 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.