Краткое содержание
Если вы хотите узнать, насколько быстро работает программа, Hyperfine предоставит вам всю необходимую информацию. Этот удобный и многофункциональный инструмент для Linux делает процесс бенчмаркинга простым и доступным.
Что такое Hyperfine?
Hyperfine — это инструмент для бенчмаркинга с открытым исходным кодом, доступный на Linux, macOS и Windows. Он функционирует подобно команде time, которая есть практически в каждом дистрибутиве и оболочке, измеряя время выполнения программы:
На первый взгляд, hyperfine выполняет такую же функцию, что и команда time, но с более наглядным выводом. Тем не менее, у этого инструмента есть ряд преимуществ; Hyperfine:
Hyperfine особенно полезен, когда я разрабатываю собственные программы. Я могу проверять оптимизации, тестировать их с помощью Hyperfine и вносить изменения в свой код. Также его можно использовать для сравнения различных программ, например, между grep и ripgrep:
Как установить и использовать Hyperfine
Написанный на Rust, Hyperfine — это высокопортативный инструмент, который поставляется с руководством пользователя и современными командными функциями, такими как длинные параметры и автозаполнение.
Почему стоит изучать Rust, особенно если вы новичок в программировании
Rust — это один из самых новых языков программирования, который может изменить ваше представление о коде.
Установка
Пакеты Hyperfine доступны для множества дистрибутивов Linux и других операционных систем.
На Ubuntu я могу установить Hyperfine из .deb пакета, например, следующим образом:
Проверьте страницу проекта на GitHub для получения последней версии под вашу архитектуру.
На Fedora можно использовать менеджер пакетов dnf для установки Hyperfine с помощью простой команды:
На macOS или другой поддерживаемой системе можно воспользоваться Homebrew:
Для других систем ознакомьтесь с детальной инструкцией по установке проекта.
Основы использования Hyperfine
Hyperfine запускает подкоманду для выполнения указанных вами команд. Не беспокойтесь сильно об этом, но это значит, что Hyperfine следует запускать следующим образом:
В частности, это означает, что вы не можете просто запустить Hyperfine с программой в текущей директории, передавая её имя в качестве аргумента:
Если попытаться это сделать, возникнет ошибка, например, «Команда завершилась с ненулевым кодом выхода 127», что может усложнить диагностику.
Вместо этого укажите путь к команде, например:
По тем же причинам лучше заключать команды в кавычки:
Как бенчмаркинг с Hyperfine может вам помочь
Бенчмаркинг может быть столь же точным, как вы решите, будь то продвижение продукта, обоснование изменений в коде или просто интерес к тому, как быстро можно запустить grep на вашем жестком диске.
Проверка эффективности вашего кода
Hyperfine отлично справляется с сравнением результатов двух версий программы в одинаковых условиях. С его помощью я могу отладить логику своей программы и оптимизировать код.
В нашей статье о команде time в Linux представлены два примера программ на C, которые можно использовать для демонстрации данной концепции. Первая, loop1.c, выполняет итерацию по строке фиксированное количество раз (500 000), подсчитывая количество дефисов:
Вторая, loop2.c, очень похожа, но напрямую вызывает strlen() в условии цикла:
Поскольку вызов функции теперь находится внутри внешнего цикла, strlen() выполняется 500 000 раз вместо одного. Команда time может дать базовую информацию о том, как эти две версии программы сравниваются:
Но hyperfine предоставляет больше деталей, даже в самом базовом, стандартном режиме:
Время выполнения долгих команд
Хотя Hyperfine особенно интересен программистам и системным администраторам, я могу использовать его и в других ситуациях. Например, если я часто использую длительные команды и ставлю их в фоновый режим, я, вероятно, не знаю, сколько времени они занимают. Привычка запускать их через Hyperfine может оказаться полезной:
В случае долгих команд я, скорее всего, захочу ограничить количество их запусков с помощью Hyperfine. По умолчанию этот инструмент использует свои эвристики для определения оптимального количества запусков для получения точных результатов. Я могу переопределить это с помощью параметра --runs:
Как справляться с предупреждениями и ошибками
Hyperfine уделяет большое внимание сообщениям о предупреждениях, вероятно, потому что его цель — предоставить высокоточную статистику. Но не всегда важно получать строго научные результаты; иногда достаточно просто общее представление. Hyperfine предлагает опции для таких случаев.
Одним из таких случаев является команда, которая возвращает ненулевой код выхода, что обычно указывает на неудачное выполнение команды. В таких ситуациях Hyperfine выдаст сообщение об ошибке:
Как объясняет сообщение об ошибке, я могу игнорировать такие ошибки с помощью параметра -i или попытаться диагностировать их с помощью --show-output. В зависимости от конкретной задачи, первый вариант, вероятно, будет достаточным.
Например, если предыдущий пример du выдает ошибку, он всё равно выполнится до завершения. Если я запускаю du на всем диске, он может завершиться с ошибкой прав доступа на одном файле, что делает запуск бесполезным. Обратите внимание, что при запуске с -i всё равно будет выдано предупреждение:
Предупреждение: игнорирование ненулевого кода выхода.
Я также могу столкнуться с ошибками, связанными с тем, как Hyperfine запускается, когда кэш холодный или работают другие программы. Параметр --warmup выполнит мою команду несколько раз перед началом бенчмаркинга, что поможет разогреть кэш и может дать более реалистичные результаты.
Я могу сделать наоборот, чтобы измерить наихудший случай. Параметр --prepare позволяет мне запустить другую команду во время каждого запуска бенчмарка; я сам должен предоставить команду, которая очистит любой кэш, который может повлиять на мои результаты.
Работа с результатами Hyperfine
Hyperfine выводит результаты времени в удобном компактном формате с цветовой подсветкой, что идеально подходит для быстрого просмотра в терминале. Однако, если я хочу проанализировать результаты более тщательно, мне потребуется более удобный формат.
Параметр --export-json позволяет мне указать файл для сохранения результатов в формате JSON. Они будут выглядеть примерно так:
Эти результаты показывают, что Hyperfine может запускать мою команду значительно большее количество раз, чем я мог ожидать. В этом случае он выполнил ls более 400 раз, чтобы собрать обширный набор данных.
Я даже могу рассмотреть возможность регулярного проведения такого бенчмаркинга как для конкретного программного обеспечения, так и для текущего оборудования, на котором я это запускаю. Настройка cron-задания для автоматизации бенчмаркинга значительно упростит этот процесс.
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Вы также можете читать наши материалы в:
- Telegram: https://t.me/gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru