Резюме
- Hyperfine — это инструмент для сравнительного анализа, который выполняет команды несколько раз для получения точных средних значений.
- Hyperfine удобен в использовании и позволяет экспортировать результаты в форматах Markdown или JSON для дальнейшего анализа.
- Вы можете использовать Hyperfine для сравнения эффективности программ, оптимизации кода и автоматизации сравнительного анализа.
Если вам нужно узнать, насколько быстро он работает, Hyperfine вам это скажет. Этот удобный, универсальный инструмент, доступный на Linux, берет на себя все усилия по бенчмаркингу.
Что такое гипертонкий?
Hyperfine — это инструмент для бенчмаркинга с открытым исходным кодом для Linux, macOS и Windows. Как и команда time, которая доступна в большинстве дистрибутивов и оболочек, hyperfine измеряет время, необходимое для запуска программы:
На первый взгляд, hyperfine делает ту же работу, что и time, с более красивым выводом. Но у инструмента есть несколько преимуществ; Hyperfine:
- Выполняет команду несколько раз, получая более точные средние значения.
- Можно тестировать и сравнивать несколько команд одновременно.
- Учитывает кэширование, выбросы и влияние появления ракушек на результаты.
- Возможен экспорт результатов в форматах Markdown или JSON для дальнейшего анализа.
Hyperfine особенно полезен, когда вы пишете собственные программы. Вы можете попробовать оптимизации, протестировать их с помощью Hyperfine и обновить свой код соответствующим образом. Но вы также можете использовать его для выбора между различными программами, например grep и ripgrep:
Как установить и использовать Hyperfine
Hyperfine, написанная на Rust, представляет собой высокопортируемую команду, которая поставляется со страницами руководства и современными функциями командной строки, такими как параметры расширенной формы и автодополнение клавишей Tab.
Установка:
Пакеты Hyperfine доступны для многих дистрибутивов Linux и других ОС.
В Ubuntu вы можете установить Hyperfine из релиза .deb, например
wget https://github.com/sharkdp/hyperfine/releases/download/v1.19.0/hyperfine_1.19.0_amd64.deb
sudo dpkg -i hyperfine_1.19.0_amd64.deb
Проверьте страницу проекта на GitHub на предмет последней версии вашей архитектуры.
В Fedora вы можете использовать менеджер пакетов dnf для установки Hyperfine с помощью простой команды:
dnf установить гипертонкий
На macOS (или другой системе, которая ее поддерживает) вы можете использовать Homebrew:
brew установить гиперфинит
Для других систем ознакомьтесь с подробными инструкциями по установке проекта.
Базовое использование сверхтонкого
Hyperfine порождает подоболочку для запуска команд, которые вы ей передаете. Вам не нужно слишком много думать об этом, но это значит, что вам следует запустить Hyperfine следующим образом:
сверхтонкая команда-в-пути
# ИЛИ
сверхтонкий /полный/путь/к/команде
В частности, это означает, что вы не можете просто запустить Hyperfine для программы в текущем каталоге, передав ее имя в качестве аргумента:
сверхтонкий a.out
Если вы попробуете это сделать, вы получите ошибку типа «Команда завершена с ненулевым кодом выхода 127», которую может быть сложно отладить.
Вместо этого просто передайте путь к команде, например:
сверхтонкий ./a.out
По тем же причинам лучше всего процитировать ваши команды:
сверхтонкий «ду -сх ~»
Как бенчмаркинг с Hyperfine может вам помочь
Сравнительный анализ может быть настолько точным, насколько вы захотите, независимо от того, рекламируете ли вы продукт, выступаете за изменение кода или просто интересуетесь тем, насколько быстро вы можете запустить grep на своем жестком диске.
Проверка эффективности вашего кода
Hyperfine отлично подходит для сравнения результатов двух версий программы в одинаковых условиях. Используя его, вы можете улучшить логику своей программы и оптимизировать свой код.
Наша статья о команде Linux time включает два примера программ на языке C, которые вы можете использовать для демонстрации этой концепции. Первая, loop1.c, выполняет итерацию по строке фиксированное количество раз (500,000 XNUMX), подсчитывая количество дефисов:
#включить «stdio.h»
#включить «строку.h»
инт мейн() {
char szString[] = «как-быть-гиком-как-быть-гиком-как-быть-гиком-как-быть-гиком»;
int i, j, len = strlen(szString), count = 0;
для (j = 0; j <500000; j ++)
для (i = 0; i < len; i++)
если (szString[i] == ‘-‘)
count ++;
printf(«Подсчитано %d дефисов», count);
}
Второй, loop2.c, очень похож, но он вызывает strlen() непосредственно в условии цикла:
#включить «stdio.h»
#включить «строку.h»
инт мейн() {
char szString[] = «как-быть-гиком-как-быть-гиком-как-быть-гиком-как-быть-гиком»;
int i, j, количество = 0;
для (j = 0; j <500000; j ++)
для (i = 0; i < strlen(szString); i++)
если (szString[i] == ‘-‘)
count ++;
printf(«Подсчитано %d дефисов», count);
}
Поскольку вызов функции теперь находится внутри внешнего цикла, strlen() выполняется 500,000 XNUMX раз вместо одного. Команда time может дать базовую информацию о том, как сравниваются эти две версии одной и той же программы:
Но сверхтонкий режим дает больше деталей даже в самом базовом режиме по умолчанию:
Синхронизация длительных команд
Хотя Hyperfine особенно интересен программистам и системным администраторам, вы можете использовать его и в других обстоятельствах. Например, если вы когда-либо использовали длительную команду и перевели ее в фоновый режим во время работы, вы, вероятно, не знаете, сколько времени она на самом деле занимает. Привычка запускать ее через Hyperfine может помочь:
Для долго выполняющейся команды вы, вероятно, захотите ограничить количество запусков Hyperfine. По умолчанию инструмент использует собственную эвристику для определения хорошего количества запусков для получения точных результатов. Вы можете переопределить это с помощью параметра —runs:
сверхтонкий — выполняется 1 ‘du -skh ~’
Работа с предупреждениями и ошибками
Hyperfine очень заинтересован в сообщении предупреждений, вероятно, потому, что он стремится предоставить высокоточную статистику. Но вы не всегда можете слишком беспокоиться о получении строго научного результата; иногда достаточно просто получить смутное понимание. Hyperfine предоставляет опции, которые подходят для такого случая.
Одним из таких случаев является команда, возвращающая ненулевой код выхода, что обычно указывает на то, что команда не выполнена. В таких случаях Hyperfine сообщит об ошибке:
Как поясняет сообщение об ошибке, вы можете игнорировать такие ошибки с помощью параметра -i или попытаться диагностировать их с помощью —show-output. В зависимости от того, что вы делаете, первый вариант, вероятно, будет достаточно хорош.
Например, если предыдущий пример du выдает ошибку, он все равно будет работать до завершения. Если вы запустите du на всем диске, он может завершиться ошибкой прав доступа для одного файла, что сделает запуск бесполезным. Обратите внимание, что запуск с -i все равно выдаст предупреждение:
Предупреждение: игнорирование ненулевого кода выхода.
Вы также можете увидеть ошибки, связанные с тем, как работает Hyperfine, когда кэш холодный или запущены другие программы. Параметр —warmup выполнит вашу команду несколько раз, прежде чем начнется тестирование, что помогает разогреть кэш и может дать более реалистичные результаты.
Вы также можете сделать наоборот, чтобы измерить наихудший случай. Параметр —prepare позволяет вам запускать другую команду во время каждого запуска бенчмаркинга; вы можете предоставить команду, которая очистит любой кэш, который может повлиять на ваши результаты.
Работа с результатами Hyperfine
Hyperfine показывает результаты измерения времени в удобном компактном формате с цветовым выделением, который идеально подходит для быстрой проверки в вашем терминале. Однако если вы хотите проанализировать результаты более подробно, вам понадобится более удобный формат.
Параметр —export-json позволяет указать файл для сохранения результатов в формате JSON. Они будут выглядеть примерно так:
Эти результаты показывают, что Hyperfine может запустить вашу команду гораздо больше раз, чем вы ожидаете. В этом случае он запустил ls более 400 раз, чтобы построить полный набор результатов.
Вы даже можете захотеть запустить этот тип бенчмаркинга как обычный тест, либо против определенного программного обеспечения, либо текущего оборудования, на котором вы его запускаете. Настройка задания cron для автоматизации бенчмаркинга значительно упростит этот процесс.