Как да използвате командата time в Linux

Искате ли да знаете колко време протича един процес и много повече? Командата за време на Linux връща статистика за времето, като ви дава страхотна представа за ресурсите, използвани от вашите програми.

времето има много роднини

Има много Linux дистрибуции и различни Unix-подобни операционни системи. Всеки от тях има командна обвивка по подразбиране. Най-често срещаната обвивка по подразбиране в съвременните Linux дистрибуции е bash shell. Но има много други, като Z shell (zsh) и Korn shell (ksh).

Всички тези черупки включват своя собствена команда за време, или като a вградени команда или като а запазена дума. Когато въведете време в прозорец на терминала, шелът ще изпълни вътрешната си команда, вместо да използва двоичния файл за време на GNU, който се предоставя като част от вашата Linux дистрибуция.

Искаме да използваме GNU версията на времето, защото има повече настроики и е по-гъвкав.

Кое време ще тича?

Можете да проверите коя версия ще се изпълнява, като използвате командата type. type ще ви уведоми дали обвивката ще се справи сама с вашата инструкция, с нейните вътрешни процедури, или ще я предаде на двоичния файл на GNU.

в прозорец на терминала въведете типа на думата, интервала и след това думата време и натиснете Enter.

type time

Можем да видим, че в bash shell времето е запазена дума. Това означава, че Bash ще използва своите вътрешни времеви рутинни процедури по подразбиране.

type time

В Z обвивката (zsh) времето е запазена дума, така че вътрешните процедури на обвивката ще се използват по подразбиране.

type time

В обвивката на Korn времето е ключова дума. Вместо командата GNU time ще се използва вътрешна рутина.

Изпълнение на GNU time Command

Ако обвивката на вашата Linux система има вътрешна времева рутина, ще трябва да сте изрични, ако искате да използвате двоичния файл за време на GNU. Трябва или:

Предоставете целия път към двоичния файл, като /usr/bin/time. Изпълнете командата which time, за да намерите този път.
Използвайте командно време.
Използвайте обратна наклонена черта като време.

  Как да използвате командата seq в Linux

Командата which time ни дава пътя към двоичния файл.

Можем да тестваме това, като използваме /usr/bin/time като команда за стартиране на двоичния файл на GNU. Това работи. Получаваме отговор от командата time, която ни казва, че не сме предоставили никакви параметри на командния ред, по които да работи.

Въвеждането на командно време също работи и ние получаваме същата информация за употреба от времето. Командната команда казва на обвивката да игнорира следващата команда, така че тя да бъде обработена извън обвивката.

Използването на символ преди името на командата е същото като използването на команда преди името на командата.

Най-простият начин да се уверите, че използвате двоичния файл за време на GNU, е да използвате опцията за обратна наклонена черта.

time
time

time извиква шел версията на времето. времето използва двоичното време.

Използване на командата за време

Нека да определим времето за някои програми. Използваме две програми, наречени loop1 и loop2. Те са създадени от loop1.c и loop2.c. Те не правят нищо полезно, освен да демонстрират ефектите от един вид неефективност на кодирането.

Това е loop1.c. Дължината на низ е необходима в рамките на двата вложени цикъла. Дължината се получава предварително, извън двата вложени цикъла.

#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

Сега нека направим същото за loop2.

time ./loop2

Това ни даде два набора резултати, но те са в наистина грозен формат. Можем да направим нещо по въпроса по-късно, но нека изберем няколко части информация от резултатите.

Когато програмите се изпълняват, има два режима на изпълнение, между които те се превключват напред и назад. Те се наричат ​​потребителски режим и режим на ядрото.

Накратко казано, процес в потребителски режим не може директно да има достъп до хардуер или референтна памет извън собственото си разпределение. За да получи достъп до такива ресурси, процесът трябва да направи заявки към ядрото. Ако ядрото одобри заявката, процесът влиза в изпълнение в режим на ядрото, докато изискването не бъде удовлетворено. След това процесът се превключва обратно към изпълнение в потребителски режим.

Резултатите за loop1 ни казват, че loop1 е прекарал 0,09 секунди в потребителски режим. То е прекарало нула време в режим на ядрото или времето в режим на ядрото е твърде ниска стойност, за да се регистрира, след като е закръглено надолу. Общото изминало време беше 0,1 секунди. loop1 получи средно 89% от процесорното време за продължителността на общото изминало време.

Изпълнението на неефективната програма loop2 отне три пъти повече време. Общото му изминало време е 0,3 секунди. Продължителността на времето за обработка в потребителски режим е 0,29 секунди. Нищо не се регистрира за режим на ядрото. loop2 получи средно 96% от процесорното време за продължителността на неговото изпълнение.

Форматиране на изхода

Можете да персонализирате изхода от време, като използвате низ за формат. Форматният низ може да съдържа текст и спецификатори на формат. Списъкът с спецификатори на формат може да бъде намерен на страницата man за време. Всеки от спецификаторите на формат представлява част от информация.

Когато низът е отпечатан, спецификаторите на формат се заменят с действителните стойности, които представляват. Например, спецификаторът на формата за процента на процесора е буквата P. За да посочите на времето, че спецификаторът на формат не е просто обикновена буква, добавете знак за процент към него, като %P . Нека го използваме като пример.

Опцията -f (форматиран низ) се използва, за да каже на времето, че това, което следва, е низ за форматиране.

Нашият форматен низ ще отпечата символите „Програма:“ и името на програмата (и всички параметри на командния ред, които предавате на програмата). Спецификаторът на формат %C означава „Име и аргументи от командния ред на командата, която се определя във времето“. n кара изхода да се премести на следващия ред.

Има много спецификатори на формати и те са чувствителни към главните букви, така че се уверете, че ги въвеждате правилно, когато правите това за себе си.

След това ще отпечатаме знаците "Общо време: ", последвани от стойността на общото изминало време за това изпълнение на програмата (представено от %E).

Използваме n, за да дадем още един нов ред. След това ще отпечатаме знаците „User Mode(s)“, последвани от стойността на времето на процесора, прекарано в потребителски режим, означено с %U.

Използваме n, за да дадем още един нов ред. Този път се подготвяме за стойността на времето на ядрото. Отпечатваме символите “Kernel Mode(s)”, последвани от спецификатора на формат за времето на процесора, прекарано в режим на ядрото, което е %S.

Накрая ще отпечатаме символите “nCPU: ”, за да ни дадем нов ред и заглавието за тази стойност на данните. Спецификаторът на формат %P ще даде средния процент на процесорното време, използвано от времевия процес.

Целият форматен низ е увит в кавички. Можехме да включим някои t символа, за да поставим табулации в изхода, ако бяхме придирчиви относно подравняването на стойностите.

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

Изпращане на изхода във файл

За да запазите запис на времето от проведените от вас тестове, можете да изпращате резултатите от време във файл. За да направите това, използвайте опцията -o (изход). Резултатът от вашата програма все още ще се показва в прозореца на терминала. Само изходът от времето се пренасочва към файла.

Можем да стартираме отново теста и да запишем изхода във файла test_results.txt, както следва:

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

Изходът на програмата loop1 се показва в прозореца на терминала и резултатите от времето отиват във файла test_results.txt.

Ако искате да заснемете следващия набор от резултати в същия файл, трябва да използвате опцията -a (добавяне), както следва:

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

Сега трябва да е ясно защо използвахме спецификатора на формат %C, за да включим името на програмата в изхода от форматиращия низ.

И ние сме извън времето

Вероятно от най-голяма полза за програмистите и разработчиците за фина настройка на техния код, командата time е полезна и за всеки, който иска да открие малко повече за това какво се случва под капака всеки път, когато стартирате програма.