【问题标题】:Best way to measure the execution time of methods [closed]衡量方法执行时间的最佳方法[关闭]
【发布时间】:2018-02-09 11:42:39
【问题描述】:

我正在努力寻找最佳方法来衡量一种方法在 Application Insights 上记录它们的持续时间,我知道如果我们这样做是有可能的:

public void TestMethod()
{    
    var sw = Stopwatch.StartNew();

    //code here

    sw.Stop();
    Console.WriteLine("Time elapsed: {0}", sw.Elapsed);
}

但是,正如你所想的,我不想在所有方法上都写它,理想情况下,我想使用一个装饰器,类似于这个。

[MeasureTime]
public void TestMethod()
{
    //code here
}

或类似的东西。所以我的问题是:我怎样才能构建这样的东西?有没有更好的方法?

提前致谢!

【问题讨论】:

标签: c# .net performance logging azure-application-insights


【解决方案1】:

执行此操作的一种方法是使用像“Fody”这样的装配编织器,其扩展程序完全符合您的要求。请参阅此链接以获取示例扩展:https://github.com/Fody/MethodTimer

Fody 的工作原理是在编译时使用您在问题中建议的属性将代码注入您的代码库。正如您所描述的那样,提供的扩展使用秒表记录代码的执行时间。

使用示例:

安装库后,您可以将注释 [Time] 添加到您希望测量的方法中:

[Time]
public void TestMethod()
{
    //code here
}

然后,您可以创建一个自定义拦截器(Fody 扩展程序将自动拾取的静态类),您可以使用该拦截器将指标跟踪添加到应用程序洞察中:

public static class MethodTimeLogger
{
    public static void Log(MethodBase methodBase, long milliseconds)
    {
        var sample = new MetricTelemetry();
        sample.Name = methodBase.Name;
        sample.Value = milliseconds;
        // Your telemetryClient here
        telemetryClient.TrackMetric(sample);
    }
}

【讨论】:

  • 太棒了!谢谢你好先生。 +1 祝你好运:)
  • 太棒了!谢谢! :)
【解决方案2】:

我所做的是创建一个 IDisposable 类,它将在构造函数中启动秒表并在 dispose 中停止/打印结果:

public class Superwatch : IDisposable
{
    static Stopwatch Watch = new Stopwatch();
    static Superwatch()
    {
        Watch.Start();
    }

    TimeSpan Start;
    public Superwatch()
    {
        Start = Watch.Elapsed;
    }

    public void Dispose()
    {
        TimeSpan elapsed = Watch.Elapsed - Start;
        Console.WriteLine($"Time elapsed: {elapsed}");
    }
} 

然后只需将该方法打包到使用您创建的类的实例中。

using (var watch = new Superwatch())
{
      //piece of code
}

不像装饰器那样干净,但相对干净的 imo 和可配置的代码片段。

【讨论】:

  • OP想要装饰一个被测量的方法。顺便说一句:你为​​什么还要实现IDisposable?这里没有什么可以处理的。
  • @HimBromBeere The Op 说ideally 和Or something similar -> 我认为这个答案很好。而IDisposable 可以在using 块中使用。
  • @STDMP 您可以在构造函数中添加[CallerMemberName] string memberName = "" 以获取方法名称并使用它初始化Info。
  • 您在这里误用了Dispose-模式来指示时间度量的开始和结束。
  • @HimBromBeere 这很相似,但这正是 OP 所要求的。仅做同样的事情就是“更清洁”。 Imo 这个(虽然可能不是最好的方法)给你一个非常干净和可读的结果,并且很容易实现。
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
相关资源
最近更新 更多