【问题标题】:Profiling C# application without using external tools在不使用外部工具的情况下分析 C# 应用程序
【发布时间】:2020-01-13 23:08:06
【问题描述】:

我有一个 C#(dotnet 核心)应用程序,它从队列中获取输入并对其进行处理。处理时间由许多因素决定。其中之一是请求本身。

我的代码如下所示:

public static void main()
{
    DoWork(new TaskInformation("abc"));
}

public static void DoWork(TaskInformation input)
{
    InnerWork1(input);
    InnerWork2(input);
}

private static void InnerWork1(TaskInformation input)
{
    // Running code here.
    Thread.Sleep(1000);
}

private static void InnerWork2(TaskInformation input)
{
    // Running code here.
    Thread.Sleep(2000);
}

为了提高我的应用程序的性能,我想开发一个可以运行并测量执行时间的小工具。如果时间超过某个阈值 - 它会做一些事情。

所以,我想做的是用Stopwatch 自动“包装”我的内部函数(InnerWork1\2) - 无需以编程方式进行。

我将打开此分析功能的方式应该是这样的:

public static void main()
{
    RunWithProfiling(DoWork, new TaskInformation("abc"));
}

因此,在这种情况下,预期的分析结果将是:

DoWork - took 3 seconds
    InnerWork1 - took 1 second
    InnerWork2 - took 2 second

问题:

  1. 问题是是否有可能实现这样的机制?也许有反射?
  2. 这是否可以从代码中运行 C# 分析器?诸如“代码将自行分析”之类的内容。

【问题讨论】:

标签: c# .net-core profiling


【解决方案1】:

您可以使用委托将您的方法传递给RunWithProfiling 方法,在我的示例中我将使用Action,然后使用Stopwatch 测量其调用时间:

private static void RunWithProfiling(Action method)
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    method.Invoke();
    stopwatch.Stop();

    Console.WriteLine($"{method.Method.Name} - took {stopwatch.Elapsed.Seconds} second(s).");

}

和用法

public static void DoWork()
{
    RunWithProfiling(InnerWork1);
    RunWithProfiling(InnerWork2);
}

例如,您可以使用RunWithProfiling 方法返回long,然后将结果相加得到整个执行时间。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 2010-09-20
    • 2010-10-10
    • 2013-05-30
    • 2020-05-17
    • 2012-08-12
    • 2018-09-04
    • 2012-06-07
    相关资源
    最近更新 更多