コマンドの速さを測ろう!ベンチマークツール「hyperfine」入門

タグ GitHubオープンソースsharkdphyperfine

このソフトで何ができる?

hyperfine(ハイパーファイン)は、コマンドの実行時間を正確に計測・比較できるツールです。同じ処理をこなす複数のコマンドを並べて比較したり、統計的に信頼性の高い計測結果をわかりやすく表示したりできます。「このコマンドとあのコマンド、どっちが速いんだろう?」という疑問に、数値でズバリ答えてくれます。

どんな人におすすめ?

  • スクリプトを最適化したい方:シェルスクリプトや自作プログラムの改善前後で速さを比べたいときに重宝します。
  • ツール選びで迷っている方grepripgrep など、同じ目的で使える複数のコマンドをどれにするか決めたいとき、実際の速度差を数字で確認できます。
  • プログラミングを学んでいる方:自分のコードがどれくらい速いか、改良によってどう変わったかを体感するのに最適です。
  • 開発環境を整えたいエンジニア:ビルドコマンドやテストの実行時間を把握して、日々の作業を効率化したい方にも向いています。

一言で言えば、「コマンドを速くしたい・比べたい」という気持ちがある方なら誰でも使えるツールです。

インストール方法

hyperfine は Rust 製のツールで、cargo コマンドを使って簡単にインストールできます。Rust の開発環境(rustup)が入っていれば、以下のコマンド一行でOKです。

cargo install hyperfine

macOS の方は Homebrew でもインストールできます。

brew install hyperfine

Linux(Debian/Ubuntu 系)の場合は、apt でも入手できます。

sudo apt install hyperfine

インストール後、以下のコマンドでバージョンを確認してみましょう。

hyperfine --version

基本的な使い方

シンプルな計測

まずは一番シンプルな使い方から。hyperfine の後に計測したいコマンドを引用符で囲んで書くだけです。

hyperfine 'sleep 0.3'

実行すると、以下のような結果が表示されます。

Benchmark 1: sleep 0.3
  Time (mean ± σ):     306.9 ms ±   1.0 ms    [User: 1.0 ms, System: 1.8 ms]
  Range (min … max):   305.6 ms … 309.5 ms    10 runs

「平均 306.9 ミリ秒、標準偏差 1.0 ミリ秒」というように、1回だけ計測するより何倍も信頼性の高い結果が得られます。デフォルトでは最低10回以上・3秒以上の計測を自動で行ってくれるので、計測回数を自分で決める手間もありません。

複数コマンドを比較する

hyperfine の真骨頂は、複数のコマンドを同時に比較できる点です。たとえば findfd(高速版ファイル検索ツール)を比べる場合:

hyperfine 'find . -name "*.txt"' 'fd -e txt'
Benchmark 1: find . -name "*.txt"
  Time (mean ± σ):     86.4 ms ±   3.6 ms    [User: 28.5 ms, System: 56.8 ms]
  Range (min … max):   81.2 ms … 95.0 ms    31 runs

Benchmark 2: fd -e txt
  Time (mean ± σ):     19.2 ms ±   0.8 ms    [User: 32.6 ms, System: 115.4 ms]
  Range (min … max):   17.9 ms … 21.4 ms    117 runs

Summary
  fd -e txt ran 4.50 ± 0.26 times faster than find . -name "*.txt"

最後の「Summary」の行に「fd は find より 4.50 倍速い」と結論が出るので、比較結果が一目でわかります。

ウォームアップを使う

ファイルの読み込みが多いコマンドは、最初の数回は遅くなりがちです(ディスクのキャッシュが温まっていないため)。--warmup オプションで、計測前に数回試し走りさせることができます。

hyperfine --warmup 3 'grep -R "TODO" .'

計測回数を指定する

手軽にさっと確認したいときは、--runs で回数を減らせます。

hyperfine --runs 5 'npm run build'

活用アイデア

アイデア1:プログラムの改善効果を数値で確認する

自分が書いたスクリプトを改良したとき、「なんとなく速くなった気がする」ではなく、数値で確認できます。改良前のスクリプトと改良後のスクリプトを並べて比較することで、どれだけ速くなったかを客観的に把握できます。

hyperfine 'python old_script.py' 'python new_script.py'

アイデア2:結果をファイルに保存して後で見返す

--export-markdown オプションを使うと、結果を Markdown 形式の表として保存できます。チームへの共有や記録として便利です。

hyperfine --export-markdown result.md 'command_a' 'command_b'

JSON 形式でも出力できるので、結果をプログラムで処理したい場合にも対応できます。

hyperfine --export-json result.json 'command_a' 'command_b'

アイデア3:スレッド数などのパラメータを変えながら比較する

--parameter-scan を使うと、同じコマンドで値を少しずつ変えながら計測できます。たとえばスレッド数を1から8まで変えて性能を調べる、といった使い方ができます。

hyperfine --parameter-scan num_threads 1 8 'my_program --threads {num_threads}'

どの設定値が一番速いかを一度に確認できるので、チューニング作業がぐっと楽になります。

アイデア4:CI/CD パイプラインに組み込む

継続的インテグレーション(自動テストの仕組み)に組み込んで、新しいコードのビルド時間やテスト実行時間を定期的に記録することもできます。「最近のコード変更でビルドが遅くなっていないか」を自動で監視する用途にも使えます。

まとめ

hyperfine は、コマンドの実行速度を手軽に・正確に計測できるツールです。「このコマンドとあのコマンド、どちらが速いか」という疑問に、統計的な根拠のある数値で答えてくれます。インストールも一行で完了し、使い方もシンプルなので、初心者でもすぐに使い始められます。

複数コマンドの比較、結果のファイル出力、パラメータを変えながらの連続計測など、できることも充実しています。プログラムの最適化や、日々使うツール選びの判断材料として、ぜひ活用してみてください。「速さ」を数値で見えるようにするだけで、開発の楽しさがひとつ増えるはずです。