WaitAll结构中各个线程的性能测量

时间:2012-05-31 14:46:31

标签: c# multithreading performance soa stopwatch

假设我正在编写一个模拟用户在系统上执行某些操作的软件。我正在测量使用秒表完成此类操作所需的时间。

大多数情况下,这是相当直接的:模拟按钮的点击,一些服务调用与此按钮相关联。测量此服务调用完成所需的时间。

现在问题出现了,有些行动有多个与之相关的服务电话。由于它们仍然是同一逻辑动作的一部分,我使用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构成了该特定操作的一个逻辑工作。而且,当然,通过在它们周围放置一个秒表,我可以轻松地测量完成这些方法的时间。但是,我需要一个更细粒度的方法来统计我的数据。我真的很感兴趣的是每个方法完成所花费的时间,而不会丢失WaitHandle.WaitAll提供的“分组”语义。

我为克服这个问题所做的是编写一个包装类(或者更确切地说是代码生成文件),它使用回调实现了一些计时机制,因为我对实际结果并不感兴趣(保存异常,这是统计数据的一部分),我只是让它返回一些统计数据。但事实证明这是一种性能消耗。

所以,基本上,我正在寻找这种方法的替代方案。也许这比我现在想的要简单得多,但我现在似乎无法自己解决这个问题。

2 个答案:

答案 0 :(得分:1)

这似乎是Tasks的主要候选者(假设您使用的是C#4)

您可以使用MSDN: Task.Factory.FromAsync

从APM方法创建Tasks

然后,您可以使用所有丰富的TPL善良,例如个人延续。

答案 1 :(得分:0)

如果您的需求足够简单,一种简单的方法就是单独记录每个服务呼叫,然后根据各个服务呼叫计算逻辑操作。

IE如果逻辑操作A由并行服务调用B和C组成,其中B花费2秒,C花费1秒,则A花费2秒。

A =最大(B,C)