WaitAll 结构中单个螺纹的性能测量
本文关键字:性能测量 单个螺 结构 WaitAll | 更新日期: 2023-09-27 18:36:05
假设我正在编写一个模拟用户在系统上执行某些操作的软件。我正在测量使用秒表完成此类操作所需的时间。
大多数时候,这是非常困难的:单击按钮是模拟的,一些服务呼叫与此按钮相关联。测量完成此服务调用所需的时间。
现在症结来了,某些操作具有多个与之关联的服务调用。由于它们仍然是同一逻辑操作的一部分,因此我使用 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提供的"分组"语义。
为了克服这个问题,我所做的是编写一个包装类(或者更确切地说是一个代码生成文件),它使用回调实现了一些计时机制,因为我对实际结果不感兴趣(保存异常,这是统计数据的一部分),我只是让它返回一些统计数据。但事实证明,这在某种程度上是一种性能消耗。
所以,基本上,我正在寻找这种方法的替代方案。也许它比我现在想象的要简单得多,但我现在似乎无法自己弄清楚。
看起来像是Tasks
的主要候选者(假设您使用的是 C# 4
您可以使用 MSDN: Task.Factory.FromAsync 从 APM 方法创建Tasks
然后,您可以使用所有丰富的TPL优点,例如单个延续。
如果您的需求足够简单,一个简单的方法是单独记录每个服务调用,然后根据单个服务调用计算逻辑操作。
IE 如果逻辑操作 A 由并行服务调用 B 和 C 组成,其中 B 花费 2 秒,C 花费 1 秒,然后 A 花费 2 秒。
A = 最大值(B, C)