TL;DR
プログラムやその一部を実行して、対象の相対的な性能を評価すること。普通は、決まったテストを何度も実行して測る。ベンチマークに使うプログラムそのものもベンチマークと呼ぶ。
なぜ必要か
仕様だけでは比べられないシステムやアーキテクチャの性能を、実際に動かして比べられる。コードの変更で性能が悪化していないかを確かめるのにも使う。
仕組み
対象の大きさによって種類がある。実際のアプリケーションを動かすものは、現実の性能をよく表す。小さく特定のコードだけを測るものはマイクロベンチマークと呼ぶ。言語のツールにも、ベンチマークを書いて実行する仕組みがある。
- Go:
go test -bench=.で実行する。-cpuprofileや-memprofileを付けると、プロファイルも一緒に出力できる(今日から始める pprof) - Rust:
cargo benchで実行する。既定では最適化を有効にしたbenchプロファイルでビルドする。#[bench]属性は nightly でしか使えないので、stable では Criterion などのクレートを使う
注意点
- 結果は外部要因に左右される。Effective Rust 項目32 によると、信頼できる結果を得るには専用の環境が要り、前回の結果と比べないと性能の悪化を検出できない。
- ベンチマークは速度だけを測ることが多く、平均値を重視して最悪の応答時間を見落としやすい。サンプルが少ない、変数を制御していない、結果を再現できないなど、手法に問題があることも多い。
cargo benchの既定のハーネスは、ベンチマークを 1 つのスレッドで順に実行する。