パフォーマンスが非常に重要であることがわかった、一般的に使用されるいくつかのメソッドを作成しました。顕著なパフォーマンスのバグを修正するためにいくつかの変更を行った後、いくつかのテストを実施して、将来の変更によってパフォーマンスが低下しないことを確認したいと思います。ただし、これらのテストはしばしば非常に不安定であることがわかりました (ガベージ コレクション、自動テスト サーバーでのその他のアクティビティなどが原因である可能性があります)。私が疑問に思っているのは、これらの種類のテストを作成および維持するための受け入れられたベスト プラクティスがあるかということです。
これまでのところ、私のテストのほとんどは次のようになっています。
runMyCode(); // for assembly loading/jitting
var sw = Stopwatch.StartNew();
for (iterations) { runMyCode(); }
var time = sw.Elapsed;
// then either
Assert.Less(time, TimeSpan.FromSeconds(some reasonably generous amount of time));
// or
// time some other piece of benchmark code (e. g. a framework method
// which runMyCode() layers on top of). And do:
Assert.Less(time.TotalSeconds, someMultiplier * benchmarkTime.TotalSeconds);
安定性を改善しなければならない 1 つの考えは、テスト ストアがデータベースに時間を記録し、最後の N 回がベンチマークに失敗した場合にのみ失敗することです。