3

我需要测量应用程序上下文中许多不同方法的执行情况。

.NET 当然有 Stopwatch 类,它允许使用它的 .Start() 和 .Stop() 方法轻松地对一段代码进行计时。

但是,以正常方式使用 Stopwatch 类需要我用 Stopwatch 对象的实例装饰每个方法并调用它的 .Start() 和 .Stop() 方法。

我需要在数百种方法上使用秒表功能,并且不想用这段代码污染每个方法。我还希望能够打开和关闭计时。

有没有一种简单的方法可以在我自己的代码中实现通用计时解决方案?如果是这样,怎么做?代码分析器会这样做,所以我认为它一定是可能的。

4

2 回答 2

10

只是一个想法。声明一个方法如下

public static long Measure(Action action)
{
    Stopwatch sw = Stopwatch.StartNew();
    action();
    return sw.ElapsedMilliseconds;
}

并用作

var duration = Measure(() => MyMethod(param1));
于 2012-09-13T18:56:37.620 回答
1

您还可以查看 AOP 并为 Timing 方法动态创建一个包装器(但仅适用于非静态公共方法)。

如果您使用 IoC,您基本上只需要使用装饰器注册类型,这当然可以自定义并在需要时打开和关闭,甚至在特定方法上。

我之前使用 Castle:DynamicProxy 来实现这一点(用于计时和错误记录)。

编辑:一个例子(来自城堡的旧版本:动态代理)

TimerInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        invocation.Proceed();
        watch.Stop();
        //here you have the value which could be used to log (which I assume you want)
    }
}

new ProxyGenerator().CreateInterfaceProxyWithTarget<IMyInterface>(implementedObject, new TimerInterceptor());
于 2012-09-13T19:21:13.567 回答