システム上で特定のアクションを実行するユーザーをシミュレートするソフトウェアを作成しているとします。ストップウォッチを使用して、このようなアクションが完了するまでにかかる時間を測定しています。
ほとんどの場合、これは非常に簡単です。ボタンのクリックがシミュレートされ、一部のサービス呼び出しがこのボタンに関連付けられます。このサービスコールが完了するまでにかかる時間が測定されます。
ここで重要なのは、一部のアクションに複数のサービス呼び出しが関連付けられていることです。それらはすべて同じ論理アクションの一部であるため、C#が提供するシグナリングメカニズムを使用してこれらを「グループ化」しています(疑似):
var syncResultList = new List<WaitHandle>();
var syncResultOne = service.BeginGetStuff();
var syncResultTwo = service.BeginDoOtherStuff();
syncResultList.Add(syncResultOne.AsyncWaitHandle);
syncResultList.Add(syncResultTwo.AsyncWaitHandle);
WaitHandle.WaitAll(syncResultList.ToArray());
var retValOne = service.EndGetStuff(syncResultOne);
var retValTwo = service.EndDoOtherStuff(syncResultTwo);
したがって、GetStuffとDoOtherStuffは、その特定のアクションの1つの論理的な作業を構成します。そしてもちろん、ストップウォッチを配置するだけで、このメソッドの組み合わせが完了するまでにかかる時間を簡単に測定できます。しかし、統計にはもっときめ細かいアプローチが必要です。WaitHandle.WaitAllによって提供される「グループ化された」セマンティクスを失うことなく、各メソッドが完了するのにかかる時間に本当に興味があります。
これを克服するために私が行ったことは、実際の結果にはそれほど興味がないため、コールバックを使用してタイミングメカニズムを実装するラッパークラス(またはコード生成ファイル)を作成することでした(一部である例外を保存する)統計の)、私はそれがいくつかの統計を返すようにします。しかし、これはどういうわけかパフォーマンスの低下であることが判明しました。
したがって、基本的に、私はこのアプローチの代替案を探しています。今思っているよりずっと簡単かもしれませんが、今のところ自分では理解できないようです。