假设我正在编写一个模拟用户在系统上执行某些操作的软件。我正在使用秒表测量完成此类操作所需的时间。
大多数情况下,这非常简单:模拟按钮的单击,一些服务调用与此按钮相关联。测量完成此服务调用所需的时间。
现在问题来了,一些操作有多个与之关联的服务调用。由于它们仍然是相同逻辑操作的一部分,因此我使用 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 提供的“分组”语义。
我为克服这个问题所做的是编写一个包装类(或者更确切地说是一个代码生成文件),它使用回调实现一些计时机制,因为我对实际结果不感兴趣(保存异常,这是一部分的统计数据),我只是让它返回一些统计数据。但这以某种方式被证明是一种性能消耗。
所以,基本上,我正在寻找这种方法的替代方案。也许它比我现在想的要简单得多,但我现在似乎无法自己弄清楚。