使用 Stopwatch 在 .NET 中的方法级别自动分析

Posted

技术标签:

【中文标题】使用 Stopwatch 在 .NET 中的方法级别自动分析【英文标题】:Automatically profiling at the method level in .NET with Stopwatch 【发布时间】:2017-11-29 08:59:34 【问题描述】:

有没有一种方法可以清晰、轻松地分析方法/函数,而无需每次都对每个方法都进行此操作?

    声明一个秒表变量:Dim stopwatch As Stopwatch = Stopwatch.StartNew() 最后调用stopwatch.Stop()stopwatch.Elapsed.TotalMilliseconds 结尾输出结果

并不是说这很麻烦,但是在许多函数上重复它会有点弄脏代码,我想知道是否有一种方法可以在一个干净的步骤中做到这一点,即在方法开始时开始计算时间并且自动检测何时停止。我对此表示怀疑,但我不是专家。

谢谢。

【问题讨论】:

【参考方案1】:

为什么不编写自己的辅助方法?像这样:

public class TimerLogger : IDisposable

    private string _message;
    private Stopwatch _timer;

    public TimerLogger(string message)
    
        _message = message;
        _timer = new Stopwatch();
        _timer.Start();
    

    public void Dispose()
    
        _timer.Stop();
        Console.WriteLine($"Calculation time for _message: _timer.ElapsedMilliseconds");        
    

用法:

using(new TimerLogger("Test"))
    for(int i = 0; i < 1000; i++)
        Thread.Sleep(5);

【讨论】:

这太棒了!几乎正是我正在寻找的东西。谢谢。【参考方案2】:

Roman 的响应正是我想要的,但它是 C#。以防万一有人需要像我一样在 VB.NET 中执行此操作,方法如下。它还输出有关调用助手的方法和特定行的详细信息。

Public Class Profiler

    Implements IDisposable

    Private ReadOnly _timer As Stopwatch

    Private ReadOnly _methodName As String
    Private ReadOnly _lineNumber As Integer

    Public Sub New(<System.Runtime.CompilerServices.CallerMemberName> Optional memberName As String = Nothing,
                   <System.Runtime.CompilerServices.CallerLineNumber()> Optional sourceLineNumber As Integer = 0)

        _timer = New Stopwatch()
        _methodName = memberName
        _lineNumber = sourceLineNumber
        _timer.Start()

    End Sub

    Public Sub Dispose() Implements System.IDisposable.Dispose

        _timer.Stop()

        Console.WriteLine("A timer was called in the method " & _methodName & ", line " & _lineNumber & "; the result was " & _timer.Elapsed.Milliseconds & "ms." );

    End Sub

End Class

祝你有美好的一天。

【讨论】:

以上是关于使用 Stopwatch 在 .NET 中的方法级别自动分析的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中的性能分析

C#中Stopwatch和DateTime中的ticks的异同

.NET 中的精确计时

基于.Net的文件增量备份系统实现

swift 用于计算已用时间的Swift类,类似于.NET的System.Diagnostics.Stopwatch类

C# Stopwatch与TimeSpan详解(转)