Вывести время выполнения команд в Linux

Измерить время выполнения команды в Linux не просто, а очень просто. Но это только на первый взгляд. Давайте посмотрим на команду time более внимательно.

Команда time

Вызов консольной команды time

Если стоит задача измерить только время выполнения команды в Linux, то все что вам необходимо — команда time.

Синтаксис данной команды очень простой:

Пример вызова — замеряем время выполнения команды sleep 1:

С помощью ключа -p можно заставить команду выводить время выполнения в сжатом Posix формате:

Другой time

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

Вот оно что! Оказывается, time, который мы вызывали — это внутренняя команда Shell.

А теперь попробуем сделать так:

А это уже внешняя команда, расположенная по пути: /usr/bin.

Попробуем вызвать ее:

Параметры вызова внешней команды time

-o FILE, --output=FILE

Перенаправление вывода статистики в файл, вместо вывода в стандартный поток ошибок. По умолчанию, существующий файл будет полностью перезаписан.

Применяется для сбора статистики из программ с пользовательским интерфейсом или выводящих информацию в поток ошибок.

-a, --append
Дополняет существующий файл новой информацией. Применяется совместно с опциями '-o' или '--output'.
-f FORMAT, --format FORMAT

Используется шаблон FORMAT для вывода статистики.

Формат вывода по умолчанию:

%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k
%Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps

Описание используемых шаблонов приведено в конце статьи.

--help
Вывод краткой помощи и завершение команды.
-p, --portability

Выводит информацию по стандарту POSIX 1003.2:
real %e
user %U
sys %S

-v, --verbose
Выводит расширенную статистику использования ресурсов с описанием каждого параметра.
--quiet
«Тихий режим» — подавление вывода команды, в том числе и ошибок.
-V, --version
Вывести версию команды time и завершить выполнение.

Внешний time по умолчанию

Чтобы явно указать, какую из команд мы хотим вызвать, можно воспользоваться следующим способом:

Для того, чтобы по умолчанию запускалась внешняя команда time достаточно выполнить:

Это установит внешнюю команду time по умолчанию для текущей сессии.

Чтобы применить эти изменения для всех последующих сессий, добавьте команду alias в файл ~/.bashrc (изменения для текущего пользователя) или /etc/bash.bashrc (изменения затронут всех пользователей системы).

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

Довольно часто необходимо замерить время выполнения какого-либо участка кода в скрипте bash.

Для этого в исследуемый скрипт добавим немного кода:

Пример вывода:

Список параметров для описания формата вывода time

%
A literal ‘%’.
C
Name and command line arguments of the command being timed.
D
Average size of the process’s unshared data area, in Kilobytes.
E
Elapsed real (wall clock) time used by the process, in [hours:]minutes:seconds.
F
Number of major, or I/O-requiring, page faults that occurred while the process was running. These are faults where the page has actually migrated out of primary memory.
I
Number of file system inputs by the process.
K
Average total (data+stack+text) memory use of the process, in Kilobytes.
M
Maximum resident set size of the process during its lifetime, in Kilobytes.
O
Number of file system outputs by the process.
P
Percentage of the CPU that this job got. This is just user + system times divided by the total running time. It also prints a percentage sign.
R
Number of minor, or recoverable, page faults. These are pages that are not valid (so they fault) but which have not yet been claimed by other virtual pages. Thus the data in the page is still valid but the system tables must be updated.
S
Total number of CPU-seconds used by the system on behalf of the process (in kernel mode), in seconds.
U
Total number of CPU-seconds that the process used directly (in user mode), in seconds.
W
Number of times the process was swapped out of main memory.
X
Average amount of shared text in the process, in Kilobytes.
Z
System’s page size, in bytes. This is a per-system constant, but varies between systems.
c
Number of times the process was context-switched involuntarily (because the time slice expired).
e
Elapsed real (wall clock) time used by the process, in seconds.
k
Number of signals delivered to the process.
p
Average unshared stack size of the process, in Kilobytes.
r
Number of socket messages received by the process.
s
Number of socket messages sent by the process.
t
Average resident set size of the process, in Kilobytes.
w
Number of times that the program was context-switched voluntarily, for instance while waiting for an I/O operation to complete.
x
Exit status of the command.