今後はtesting.B.Loopが推奨される
More predictable benchmarking with testing.B.Loopによると、従来の testing.B.N と比べて Loop は
- コンパイラの最適化(インライン化やデッドコード削除)を抑制できる
- testing.B.ResetTimer や StopTimer が(よくあるケースでは)不要になる
- コードが誤って N の値に依存することがない
最適化についてはコンパイラが testing.B.Loop を検知してインライン化やデッドコード除去を抑制する。次にテストの準備(Setup)や終了処理(Teardown)が重い場合は手動で ResetTimer を呼ぶ必要があったのだけど、イテレータの開始で ResetTimer するようになっているので手動でのリセットが不要になる。ただし、Loop の内部でその一部だけ計測したい場合は今でも手動による ResetTimer が必要。
さらに、N のときは1回あたりの実行時間を計測するため何度かベンチマーク関数を呼ぶ必要があったけれど、Loop はイテレータなのでベンチマーク関数の呼び出しは1回でいい。