Как использовать команду времени в 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 time
зарезервированное слово. Это означает, что Bash будет использовать свой внутренний time
процедуры по умолчанию.
time
В оболочке Z (zsh) time
является зарезервированным словом, поэтому по умолчанию будут использоваться внутренние процедуры оболочки.
time
В оболочке 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 для разработчиков и энтузиастов
ПРОЧИТАЙТЕ СЛЕДУЮЩИЙ- & 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 и сторонник открытого исходного кода.
Прочитать полную биографию