TL;DR

プログラムやその一部を実行して、対象の相対的な性能を評価すること。普通は、決まったテストを何度も実行して測る。ベンチマークに使うプログラムそのものもベンチマークと呼ぶ。

なぜ必要か

仕様だけでは比べられないシステムやアーキテクチャの性能を、実際に動かして比べられる。コードの変更で性能が悪化していないかを確かめるのにも使う。

仕組み

対象の大きさによって種類がある。実際のアプリケーションを動かすものは、現実の性能をよく表す。小さく特定のコードだけを測るものはマイクロベンチマークと呼ぶ。言語のツールにも、ベンチマークを書いて実行する仕組みがある。

  • Go: go test -bench=. で実行する。-cpuprofile や -memprofile を付けると、プロファイルも一緒に出力できる(今日から始める pprof)
  • Rust: cargo bench で実行する。既定では最適化を有効にした bench プロファイルでビルドする。#[bench] 属性は nightly でしか使えないので、stable では Criterion などのクレートを使う

注意点

  • 結果は外部要因に左右される。Effective Rust 項目32 によると、信頼できる結果を得るには専用の環境が要り、前回の結果と比べないと性能の悪化を検出できない。
  • ベンチマークは速度だけを測ることが多く、平均値を重視して最悪の応答時間を見落としやすい。サンプルが少ない、変数を制御していない、結果を再現できないなど、手法に問題があることも多い。
  • cargo bench の既定のハーネスは、ベンチマークを 1 つのスレッドで順に実行する。

関連

出典