3

システム上で特定のアクションを実行するユーザーをシミュレートするソフトウェアを作成しているとします。ストップウォッチを使用して、このようなアクションが完了するまでにかかる時間を測定しています。

ほとんどの場合、これは非常に簡単です。ボタンのクリックがシミュレートされ、一部のサービス呼び出しがこのボタンに関連付けられます。このサービスコールが完了するまでにかかる時間が測定されます。

ここで重要なのは、一部のアクションに複数のサービス呼び出しが関連付けられていることです。それらはすべて同じ論理アクションの一部であるため、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によって提供される「グループ化された」セマンティクスを失うことなく、各メソッドが完了するのにかかる時間に本当に興味があります。

これを克服するために私が行ったことは、実際の結果にはそれほど興味がないため、コールバックを使用してタイミングメカニズムを実装するラッパークラス(またはコード生成ファイル)を作成することでした(一部である例外を保存する)統計の)、私はそれがいくつかの統計を返すようにします。しかし、これはどういうわけかパフォーマンスの低下であることが判明しました。

したがって、基本的に、私はこのアプローチの代替案を探しています。今思っているよりずっと簡単かもしれませんが、今のところ自分では理解できないようです。

4

2 に答える 2

1

Tasksこれは(C#4を使用していると仮定して)の最有力候補のように見えます

TasksMSDNを使用してAPMメソッドから作成できます:Task.Factory.FromAsync

その後、個々の継続のように、すべての豊富なTPLの良さを使用できます。

于 2012-05-31T15:19:25.323 に答える
0

ニーズが十分に単純な場合、簡単な方法は、各サービスコールを個別に記録し、個々のサービスコールに基づいて論理アクションを計算することです。

IE論理アクションAが並列サービス呼び出しBとCで構成されている場合、Bは2秒、Cは1秒かかり、Aは2秒かかります。

A = Max(B、C)

于 2012-05-31T23:59:16.177 に答える