Гид по технологиям

Как измерять время выполнения программ в Linux с помощью time

• 6 min read • Linux • Обновлено 01 Dec 2025
Измерение времени выполнения в Linux с помощью time
Измерение времени выполнения в Linux с помощью time

Иллюстрация: измерение времени выполнения программ в Linux

Кратко: команда time в Linux измеряет три значения — real (стенсовое время), user (время в пользовательском пространстве) и sys (время в ядре). Чтобы получить корректные выводы, сочетайте многократные прогоны, сброс кешей при необходимости и простую автоматизацию для усреднения результатов.

Быстрые ссылки

  • Timing Linux Programs

  • The Linux time Tool

  • Using time For Performance Measuring

  • Using time For Code Optimization

  • Wrapping up

Зачем измерять время выполнения

Измерения времени помогают понять, где тратится ресурс системы: на ожидание ввода-вывода, на вычисления в пользовательском коде или на работу внутри ядра. Это важно для тестирования производительности, оптимизации скриптов и принятия архитектурных решений. Одно предложение-определение: real — реальное (стенсовое) время, user — CPU время в режиме пользователя, sys — CPU время в режиме ядра.

Как работает команда time

Команда time возвращает три основных значения:

  • real — общее прошедшее время с момента запуска до завершения процесса, то что обычно называют wall clock time;
  • user — суммарное CPU время, потраченное в пользовательском пространстве процессом и его потомками;
  • sys — суммарное CPU время, потраченное в режиме ядра (в системных вызовах) процессом и его потомками.

Важно: user и sys отражают только активно используемое CPU время. Если процесс ждет ввода-вывода или блокируется, эти периоды не учитываются в user/sys, но включаются в real. Поэтому часто user + sys < real.

Пример простого измерения сна:

time sleep 1

При запуске вы увидите, что real примерно равен 1 секунде, а user и sys почти нулевые, так как команда sleep не нагружает CPU.

Поведение при очень коротких прогонах

Когда процесс выполняется очень быстро, измерения могут быть неточными. В таких случаях процент использования CPU или некоторые поля могут показываться как 0 или как вопросительный знак. Рекомендуется прогонять быстрые команды многократно и усреднять результаты.

Использование time для проверки кеширования и ввода-вывода

Одно из практических применений — проверить, влияет ли файловый кеш на производительность. Пример: сканирование каталога /usr, где может быть сотни тысяч файлов.

cd /usr

time find . >/dev/null 2>&1

В выводе вы получите реальное и CPU время. Если вы хотите сбросить файловые кеши и повторить замеры, выполните:

sync; echo 3 | sudo tee /proc/sys/vm/drop_caches

cd /usr

time find . >/dev/null 2>&1

Сброс inode и других кешей Linux и повторный запуск команды find в /usr

Комментарий: первая команда очищает pagecache, dentries и inode кеши. После очистки вы обычно увидите увеличение real времени первого прогона и заметное ускорение последующих запусков за счет работы кеша.

Пример: измерение скорости парсинга выводов ps с помощью awk и sed

Для сравнения двух способов извлечения второго столбца из вывода ps можно выполнить многократные прогоны и измерить суммарное время:

time for ((i=1;i<=1000;i++)); do ps -ef | awk '{print $2}' >/dev/null 2>&1; done
time for ((i=1;i<=1000;i++)); do ps -ef | sed 's|^[^ ]+[ \t]+||;s|[ \t].*||' >/dev/null 2>&1; done

Использование time для анализа среднего времени выполнения команды и оптимизации сценариев

Наблюдение: в примере sed оказался немного быстрее по real времени. Такие сравнения помогают выбрать решение с меньшим стенсовым временем или меньшей нагрузкой на CPU.

Когда измерения вводят в заблуждение

  • Нагрузочные факторы окружения: другие процессы могут потреблять CPU и I/O, искажающие результаты.
  • Кеширование: первый прогон может быть существенно медленнее, чем последующие.
  • Параллелизм и многопоточность: время real может быть меньше суммарного CPU времени для параллельных задач на многопроцессорной системе.
  • Планировщик и приоритеты процесса: nice, cgroups, cpuset и другие механизмы влияют на наблюдаемые значения.

Важно: проверяйте условия повторно и фиксируйте состояние системы перед прогоном.

Мини‑методология для корректного измерения

  1. Определите цель измерения: оптимизировать real, уменьшить CPU или снизить I/O.
  2. Подготовьте окружение: остановите ненужные сервисы или используйте изолированный тестовый стенд.
  3. Прогоните команду несколько раз, например 10–100 повторами для быстрых операций и 3–10 для медленных.
  4. Сбросьте кеши, если цель — измерить работу с диска, и задокументируйте это.
  5. Усредните значения real/user/sys и оцените разброс.
  6. При изменении реализации сравнивайте оба решения в одном и том же окружении.

Скрипт шаблон для многократных прогонов и подсчёта среднего

Ниже простой bash скрипт, который выполняет команду N раз и вычисляет средние значения real/user/sys на основе вывода time в формате GNU time с ключом -f.

#!/usr/bin/env bash

N=50
COMMAND="ps -ef | awk '{print $2}' >/dev/null 2>&1"

sum_real=0
sum_user=0
sum_sys=0

for ((i=1;i<=N;i++)); do
  # GNU time required, формат: %e - real, %U - user, %S - sys
  out=$( /usr/bin/time -f "%e %U %S" bash -c "$COMMAND" 2>&1 >/dev/null )
  read -r r u s <<< "$out"
  sum_real=$(awk "BEGIN{print $sum_real+$r}")
  sum_user=$(awk "BEGIN{print $sum_user+$u}")
  sum_sys=$(awk "BEGIN{print $sum_sys+$s}")
done

echo "avg_real="$(awk "BEGIN{print $sum_real/$N}")
echo "avg_user="$(awk "BEGIN{print $sum_user/$N}")
echo "avg_sys="$(awk "BEGIN{print $sum_sys/$N}")

Примечание: на некоторых системах системная утилита time не поддерживает ключ -f, тогда используйте команду /usr/bin/time или установите пакет time (GNU time).

Чек-листы по ролям

Разработчик

  • Измерить узкие места локально
  • Сравнить алгоритмы и библиотеки
  • Использовать многократные прогоны и усреднение

Системный администратор

  • Оценить влияние сервисов на окружение теста
  • Контролировать кеши и параметры ядра
  • Использовать изолированные ноды для честных замеров

DevOps / SRE

  • Автоматизировать тесты в CI с фиксированным окружением
  • Учитывать нагрузки соседних контейнеров или VMs
  • Задавать SLI/SLO для времени отклика там, где это применимо

Эвристики и ментальные модели

  • Если user + sys значительно меньше real, то большая часть времени уходит на ожидание (I/O, sleep, блокировки).
  • Если user >> sys, проблема в вычислениях в пользовательском коде.
  • Если sys >> user, много времени уходит в системные вызовы: частые операции ввода-вывода, сетевые операции, переключения контекста.
  • Для коротких команд всегда используйте усреднение и более длительные циклы прогона.

Сравнение подходов: когда использовать что

ЦельМетодПримечания
Измерить пользовательскую вычислительную нагрузкуtime, профилировщик CPUИспользуйте perf или gprof для детального анализа
Измерить влияние диска и кешаdrop_caches + timeОбязательно документируйте состояние кеша
Сравнить реализации на уровне командной строкимногократные прогоны + усреднениеУбедитесь в стабильности окружения

Примеры, когда time не даёт полной картины

  • Параллельные распределённые задачи: время real одной ноды не отражает суммарных затрат всей задачи.
  • Сценарии с интенсивной работой сети: сетевые задержки и очереди могут доминировать, и локальные CPU-метрики будут недостаточны.
  • Приложения с JIT или динамической оптимизацией: первый прогон может быть медленнее из-за компиляции.

Критерии приёмки

  • Показатели измерены не менее трех раз и имеют коэффициент вариации в допустимых пределах для задачи.
  • Описано состояние окружения (сброшены кеши или нет, уровень нагрузки на хосте).
  • Для оптимизаций проведено A/B сравнение в одинаковых условиях.

Глоссарий (одна строка каждый)

real — стенсовое время от запуска до завершения процесса. user — суммарное время работы процесса на CPU в пользовательском пространстве. sys — суммарное время работы процесса на CPU в режиме ядра.

Заключение

Команда time — простой и мощный инструмент для первичной оценки производительности. Она хорошо подходит для быстрого определения, где тратится время процесса, но для детального анализа нужны дополнительные инструменты и методики. Всегда прогоняйте тесты многократно, документируйте окружение и используйте автоматические скрипты для репликации результатов.

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

Краткое резюме

  • time показывает real, user и sys
  • user и sys суммируются как использованное CPU время
  • real включает периоды ожидания и блокировки
  • для честных замеров используйте повторные прогоны и фиксируйте состояние кешей

Ресурсы для чтения

  • man time
  • Документы по perf и strace
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро