Как использовать команду времени в Linux

ПК с Linux с открытым окном терминала

Фатмавати Ахмад Дзэнури / Shutterstock.com



Хотите знать, как долго длится процесс, и многое другое? Linux time Команда возвращает статистику времени, давая вам отличное представление о ресурсах, используемых вашими программами.

время имеет много родственников

Существует множество дистрибутивов Linux и различных Unix-подобных операционных систем. У каждого из них есть командная оболочка по умолчанию. Наиболее распространенной оболочкой по умолчанию в современных дистрибутивах Linux является оболочка bash. Но есть много других, таких как оболочка Z (zsh) и оболочка Korn (ksh).





Все эти оболочки содержат собственные time команда, либо как встроенный командование или как зарезервированное слово . Когда вы набираете time в окне терминала оболочка выполнит свою внутреннюю команду вместо использования GNU time двоичный файл, который предоставляется как часть вашего дистрибутива Linux.

Мы хотим использовать GNU-версию time потому что в нем больше опции и более гибкий.



Который раз будет бежать?

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

Реклама

в окне терминала введите слово type, пробел, а затем слово time и нажмите Enter.

time

введите время в окне терминала bash



Мы видим, что в оболочке bash time зарезервированное слово. Это означает, что Bash будет использовать свой внутренний time процедуры по умолчанию.

time

введите время в окне терминала zsh

В оболочке Z (zsh) time является зарезервированным словом, поэтому по умолчанию будут использоваться внутренние процедуры оболочки.

time

введите время в окне оболочки Korn

В оболочке Korn time это ключевое слово. Вместо GNU /usr/bin/time будет использоваться внутренняя процедура. команда.

СВЯЗАННЫЙ: Что такое ZSH и почему его следует использовать вместо Bash?

Запуск команды времени GNU

Если оболочка в вашей системе Linux имеет внутренний which time , если вы хотите использовать GNU command time двоичный. Вы должны либо:

  • Укажите полный путь к двоичному файлу, например ime. Запустите which time команда, чтобы найти этот путь.
  • Используйте /usr/bin/time.
  • Используйте обратную косую черту, например time.

command time команда дает нам путь к двоичному файлу.

Реклама

Мы можем проверить это, используя time как команду для запуска двоичного файла GNU. Это работает. Получаем ответ от command Команда сообщает нам, что мы не предоставили никаких параметров командной строки для ее работы.

Ввод также работает, и мы получаем ту же информацию об использовании из command. time команда указывает оболочке игнорировать следующую команду, чтобы она обрабатывалась вне оболочки.

Используя time символ перед именем команды такой же, как при использовании ime перед именем команды.

Самый простой способ убедиться, что вы используете GNU time binary - использовать опцию обратной косой черты.

loop1 loop2

loop1 призывает оболочка версия времени. time использует loop2 двоичный .

Использование команды времени

Давай займемся некоторыми программами. Мы используем две программы под названием loop1 и loop1. Они были созданы из loop1.c и loop2.c. Они не делают ничего полезного, кроме демонстрации эффектов одного типа неэффективности кодирования.

Реклама

Это loop1.c. Длина строки требуется в пределах двух вложенных циклов. Длина получается заранее, вне двух вложенных петель.

loop1

Это loop2.c. Длина строки определяется раз за разом для каждого цикла внешнего цикла. Эта неэффективность должна проявиться во времени.

loop2

Давайте запустим loop2 программа и использование time для измерения его производительности.

time

Теперь сделаем то же самое для P.

time

Это дало нам два набора результатов, но они были в очень уродливом формате. Мы можем что-то с этим сделать позже, но давайте выберем несколько кусочков информации из результатов.

При запуске программ существует два режима выполнения, между которыми они переключаются. Они называются пользовательский режим и режим ядра .

Короче говоря, процесс в пользовательском режиме не может напрямую обращаться к оборудованию или ссылочной памяти за пределами своего собственного распределения. Чтобы получить доступ к таким ресурсам, процесс должен делать запросы к ядру. Если ядро ​​одобряет запрос, процесс переходит в режим ядра до тех пор, пока требование не будет удовлетворено. Затем процесс переключается обратно в выполнение в пользовательском режиме.

Реклама

Результаты для %P скажите нам, что -f в пользовательском режиме провел 0,09 секунды. Либо он провел нулевое время в режиме ядра, либо время в режиме ядра слишком мало для регистрации после округления в меньшую сторону. Общее затраченное время составило 0,1 секунды. time получил в среднем 89% процессорного времени в течение всего прошедшего времени.

Неэффективное %C программа выполнялась в три раза дольше. Его общее затраченное время составляет 0,3 секунды. Длительность обработки в пользовательском режиме - 0,29 секунды. Ничего не регистрируется для режима ядра. было выделено в среднем 96% процессорного времени на время его выполнения.

Форматирование вывода

Вы можете настроить вывод из %E используя строку формата. Строка формата может содержать спецификаторы текста и формата. Список спецификаторов формата может быть найдено на странице руководства для . Каждый из спецификаторов формата представляет собой часть информации.

Когда строка печатается, спецификаторы формата заменяются фактическими значениями, которые они представляют. Например, спецификатор формата для процента использования ЦП - это буква %U . Чтобы указать что спецификатор формата - это не просто обычная буква, добавьте к нему знак процента, например %S . Давайте воспользуемся этим в качестве примера.

(строка формата) используется для указания %P далее следует строка формата.

Наша строка формата будет печатать символы Program: и имя программы (и любые параметры командной строки, которые вы передаете программе). спецификатор формата означает имя и аргументы командной строки для команды, для которой выполняется синхронизация. time заставляет вывод переместиться на следующую строку.

Реклама

Существует множество спецификаторов форматов, и они чувствительны к регистру, поэтому убедитесь, что вы вводите их правильно, когда делаете это для себя.

Затем мы собираемся напечатать символы «Общее время», за которыми следует значение общего времени, прошедшего для этого запуска программы (представленное -o).

Мы используем time чтобы дать еще одну новую строку. Затем мы напечатаем символы User Mode (s), а затем значение времени ЦП, проведенного в пользовательском режиме, обозначенное test_results.txt.

Мы используем loop1 чтобы дать еще одну новую строку. На этот раз мы готовимся к значению времени ядра. Мы печатаем символы Kernel Mode (s), за которыми следует спецификатор формата для времени процессора, проведенного в режиме ядра, то есть time.

Наконец, мы собираемся напечатать символы test_results.txt CPU: чтобы дать нам новую строку и заголовок для этого значения данных. -a спецификатор формата даст средний процент процессорного времени, используемого синхронизированным процессом.

Вся строка формата заключена в кавычки. Мы могли бы добавить %C символы для размещения табуляции в выводе, если мы были суетливы с выравниванием значений.

time

Отправка вывода в файл

Чтобы вести учет времени проведенных вами тестов, вы можете отправить результат из

type time
в файл. Для этого используйте
type time
(вывод) вариант. Результат вашей программы по-прежнему будет отображаться в окне терминала. Это только результат работы
type time
который перенаправляется в файл.

Реклама

Мы можем повторно запустить тест и сохранить результат в

time
файл следующим образом:

	ime
#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<500000; j++) { for (i=0; i < len; i++ ) { if (szString[i] == '-') count++; } } printf('Counted %d hyphens
', count); exit (0); } // end of main

#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<500000; j++) { // getting length of string every // time the loops trigger for (i=0; i < strlen(szString); i++ ) { if (szString[i] == '-') count++; } } printf('Counted %d hyphens
', count); exit (0); } // end of main
вывод программы отображается в окне терминала, а результаты из
	ime ./loop1
перейдите к
	ime ./loop2
файл.

Если вы хотите сохранить следующий набор результатов в том же файле, вы должны использовать

	ime -f 'Program: %C
Total time: %E
User Mode (s) %U
Kernel Mode (s) %S
CPU: %P' ./loop1
(добавить) вариант следующим образом:

	ime -o test_results.txt -f 'Program: %C
Total time: %E
User Mode (s) %U
Kernel Mode (s) %S
CPU: %P' ./loop1
cat test_results.txt

Теперь должно быть очевидно, почему мы использовали

	ime -o test_results.txt -a -f 'Program: %C
Total time: %E
User Mode (s) %U
Kernel Mode (s) %S
CPU: %P' ./loop2
спецификатор формата, чтобы включить имя программы в вывод из строки формата.

И у нас нет времени

Вероятно, наиболее полезный для программистов и разработчиков для тонкой настройки своего кода,

cat test_results.txt
Команда также полезна для всех, кто хочет узнать немного больше о том, что происходит под капотом каждый раз, когда вы запускаете программу.

Команды Linux
Файлы деготь · pv · Кот · такс · chmod · рукоятка · разница · sed · С участием · человек · толкать · popd · fsck · тестовый диск · seq · fd · пандок · компакт диск · $ ПУТЬ · awk · присоединиться · jq · складывать · уникальный · journalctl · хвостик · государство · ls · fstab · выбросил · меньше · chgrp · Chown · rev · Посмотрите · струны · тип · переименовать · застегивать · распаковать · устанавливать · размонтировать · установить · fdisk · mkfs · rm · rmdir · rsync · df · gpg · мы · нано · mkdir · от · пер · пластырь · конвертировать · rclone · крошить · SRM
Процессы псевдоним · экран · верхняя · Ницца · Ренис · прогресс · Strace · система · tmux · чш · история · в · партия · бесплатно · который · dmesg · usermod · пс · chroot · xargs · tty · мизинец · lsof · vmstat · тайм-аут · стена · да · убийство · спать · судо · его · время · groupadd · usermod · группы · lshw · неисправность · перезагружать · останавливаться · выключение · пароль · lscpu · crontab · Дата · bg · фг
Сети netstat · пинг · трассировка · ip · SS · кто · fail2ban · бмон · ты · Палец · nmap · ftp · завиток · wget · ВОЗ · кто я · В · iptables · ssh-keygen · ufw

СВЯЗАННЫЙ: Лучшие ноутбуки с Linux для разработчиков и энтузиастов

ПРОЧИТАЙТЕ СЛЕДУЮЩИЙ
  • & rsaquo; Функции и формулы в Microsoft Excel: в чем разница?
  • & rsaquo; Папке на компьютере 40 лет: как звезда Xerox создала рабочий стол
  • & rsaquo; Как найти упакованный Spotify 2021
  • & rsaquo; Киберпонедельник 2021: лучшие технические предложения
  • & rsaquo; 5 сайтов, которые должен добавить в закладки каждый пользователь Linux
  • & rsaquo; Что такое защита от падений MIL-SPEC?
Фотография профиля Дэйва Маккея Дэйв Маккей
Дэйв Маккей впервые использовал компьютеры, когда в моде была перфолента, и с тех пор он занимается программированием. Проработав более 30 лет в ИТ-индустрии, он теперь работает журналистом в области информационных технологий. За свою карьеру он работал программистом-фрилансером, менеджером международной группы разработчиков программного обеспечения, менеджером проекта ИТ-услуг, а в последнее время - специалистом по защите данных. Его статьи были опубликованы на сайтах howtogeek.com, cloudsavvyit.com, itenterpriser.com и opensource.com. Дэйв - евангелист Linux и сторонник открытого исходного кода.
Прочитать полную биографию

Интересные статьи