Jak používat příkaz time na Linuxu

Chcete vědět, jak dlouho proces běží a ještě mnohem víc? Linuxový příkaz time vrací časové statistiky, což vám dává skvělý přehled o zdrojích používaných vašimi programy.

čas má mnoho příbuzných

Existuje mnoho distribucí Linuxu a různých operačních systémů podobných Unixu. Každý z nich má výchozí příkazový shell. Nejběžnějším výchozím shellem v moderních linuxových distribucích je bash shell. Ale existuje mnoho dalších, jako je Z shell (zsh) a Korn shell (ksh).

Všechny tyto granáty obsahují svůj vlastní časový příkaz, buď jako a vestavěný příkaz nebo jako a vyhrazené slovo. Když napíšete čas v okně terminálu, shell provede svůj interní příkaz namísto použití binárního času GNU, který je součástí vaší distribuce Linuxu.

Chceme používat GNU verzi času, protože má víc možnosti a je flexibilnější.

Který čas poběží?

Pomocí příkazu type můžete zkontrolovat, která verze bude spuštěna. type vám dá vědět, zda shell zvládne vaši instrukci sám se svými interními rutinami, nebo je předá binárnímu GNU.

v okně terminálu zadejte typ slova, mezeru a potom slovo čas a stiskněte Enter.

type time

Vidíme, že v bash shellu je čas vyhrazeným slovem. To znamená, že Bash bude standardně používat své interní rutiny.

type time

V shellu Z (zsh) je čas vyhrazeným slovem, takže se standardně použijí interní rutiny shellu.

type time

V Korn shell time je klíčové slovo. Místo příkazu GNU time bude použita interní rutina.

Spuštění příkazu GNU time

Pokud má shell na vašem linuxovém systému interní časovou rutinu, budete muset být explicitní, pokud chcete použít binární čas GNU. Musíte buď:

Zadejte celou cestu k binárnímu souboru, například /usr/bin/time. Spusťte příkaz which time k nalezení této cesty.
Použijte čas příkazu.
Použijte zpětné lomítko jako čas.

Příkaz which time nám udává cestu k binárnímu systému.

Můžeme to otestovat použitím /usr/bin/time jako příkazu ke spuštění GNU binárního souboru. To funguje. Z příkazu time dostaneme odpověď, která nám říká, že jsme nezadali žádné parametry příkazového řádku, aby to fungovalo.

Psaní času příkazu také funguje a od času získáváme stejné informace o použití. Příkaz příkaz říká shellu, aby ignoroval další příkaz, takže je zpracován mimo shell.

Použití znaku před názvem příkazu je stejné jako použití příkazu před názvem příkazu.

Nejjednodušší způsob, jak zajistit, že používáte binární čas GNU, je použít volbu zpětného lomítka.

time
time

time vyvolá shellovou verzi času. čas používá binární čas.

Použití příkazu time

Pojďme načasovat nějaké programy. Používáme dva programy nazvané loop1 a loop2. Byly vytvořeny z loop1.c a loop2.c. Nedělají nic užitečného kromě demonstrování účinků jednoho typu neefektivnosti kódování.

Toto je smyčka 1.c. Délka řetězce je vyžadována v rámci dvou vnořených smyček. Délka je získána předem, mimo dvě vnořené smyčky.

#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

Nyní udělejme totéž pro smyčku2.

time ./loop2

To nám dalo dvě sady výsledků, ale jsou v opravdu ošklivém formátu. Můžeme s tím něco udělat později, ale pojďme vybrat pár informací z výsledků.

Když programy běží, existují dva režimy provádění, mezi kterými se přepínají tam a zpět. Tyto se nazývají uživatelský režim a režim jádra.

Stručně řečeno, proces v uživatelském režimu nemůže přímo přistupovat k hardwaru nebo referenční paměti mimo svou vlastní alokaci. Aby proces získal přístup k takovým zdrojům, musí odeslat požadavky do jádra. Pokud jádro žádost schválí, proces přejde do režimu jádra, dokud není požadavek splněn. Proces se poté přepne zpět do provádění uživatelského režimu.

Výsledky pro smyčku1 nám říkají, že smyčka1 strávila 0,09 sekundy v uživatelském režimu. Buď strávil nulový čas v režimu jádra, nebo je čas v režimu jádra příliš nízký na to, aby ho bylo možné zaregistrovat, jakmile byl zaokrouhlen dolů. Celkový uplynulý čas byl 0,1 sekundy. loop1 získal v průměru 89 % času CPU za dobu trvání jeho celkového uplynulého času.

Spuštění neefektivního programu loop2 trvalo třikrát déle. Jeho celkový uplynulý čas je 0,3 sekundy. Doba zpracování v uživatelském režimu je 0,29 sekundy. Nic se neregistruje pro režim jádra. loop2 získal v průměru 96 % CPU času po dobu svého běhu.

Formátování výstupu

Výstup z času můžete upravit pomocí formátovacího řetězce. Formátovací řetězec může obsahovat text a specifikátory formátu. Seznam specifikátorů formátu může být najdete na manuálové stránce za čas. Každý ze specifikátorů formátu představuje určitou informaci.

Po vytištění řetězce jsou specifikátory formátu nahrazeny skutečnými hodnotami, které představují. Například specifikátor formátu pro procento CPU je písmeno P . Chcete-li včas označit, že specifikátor formátu není jen obyčejné písmeno, přidejte k němu znak procenta, například %P . Použijme to na příkladu.

Volba -f (formátovací řetězec) se používá k určení času, že to, co následuje, je formátovací řetězec.

Náš formátovací řetězec vypíše znaky „Program: “ a název programu (a všechny parametry příkazového řádku, které programu předáte). Specifikátor formátu %C znamená „Název a argumenty příkazového řádku časovaného příkazu“. N způsobí, že se výstup přesune na další řádek.

Existuje mnoho specifikátorů formátů a rozlišují velká a malá písmena, takže se ujistěte, že je zadáváte správně, když to děláte pro sebe.

Dále vytiskneme znaky „Celkový čas: “ následované hodnotou celkového uplynulého času tohoto běhu programu (reprezentovaného %E).

Použijeme n k zadání dalšího nového řádku. Poté vytiskneme znaky „User Mode (s) “, následované hodnotou času CPU stráveného v uživatelském režimu, vyjádřené %U.

Použijeme n k zadání dalšího nového řádku. Tentokrát se připravujeme na hodnotu času jádra. Vytiskneme znaky „Režim jádra (s) “, následovaný specifikátorem formátu pro čas CPU strávený v režimu jádra, což je %S.

Nakonec vytiskneme znaky „nCPU: “, abychom získali nový řádek a název pro tuto datovou hodnotu. Specifikátor formátu %P udává průměrné procento času CPU použitého časovaným procesem.

Celý formátovací řetězec je zabalen do uvozovek. Mohli jsme zahrnout několik znaků t pro umístění tabulátorů ve výstupu, pokud bychom byli hákliví na zarovnání hodnot.

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

Odeslání výstupu do souboru

Chcete-li si uchovat záznam časování z testů, které jste provedli, můžete výstup z času odeslat do souboru. K tomu použijte volbu -o (výstup). Výstup z vašeho programu se bude stále zobrazovat v okně terminálu. Do souboru je přesměrován pouze výstup z času.

Můžeme znovu spustit test a uložit výstup do souboru test_results.txt následovně:

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

Výstup programu loop1 se zobrazí v okně terminálu a výsledky od času přejdou do souboru test_results.txt.

Pokud chcete zachytit další sadu výsledků do stejného souboru, musíte použít volbu -a (připojit) následovně:

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

Nyní by mělo být zřejmé, proč jsme použili specifikátor formátu %C k zahrnutí názvu programu do výstupu z formátovacího řetězce.

A my jsme mimo čas

Příkaz time je pravděpodobně nejvíce užitečný pro programátory a vývojáře při dolaďování jejich kódu. Příkaz time je také užitečný pro každého, kdo chce zjistit něco více o tom, co se děje pod kapotou pokaždé, když spustíte program.