2017-11-29 2 views
0

Gibt es eine Möglichkeit, eine Methode/Funktion sauber und einfach zu profilieren, die nicht jedes Mal für jede Methode durchlaufen wird?Automatisches Profiling auf Methodenebene in .NET mit Stoppuhr

  1. eine Stoppuhr Variable deklarieren: Dim stopwatch As Stopwatch = Stopwatch.StartNew()
  2. Aufruf stopwatch.Stop() am Ende
  3. die Ergebnisse mit stopwatch.Elapsed.TotalMilliseconds Ausgabe an ihn

Nicht enden, dass es ein großer Aufwand, aber es über viele Funktionen zu wiederholen beschmutzt den Code etwas, und ich frage mich, ob es vielleicht einen Weg gibt, dies in einem sauberen Schritt zu tun, der die Zeit am Anfang einer Methode zu zählen beginnt und automatisch erkennt, wann zu stoppen ist. Ich bezweifle es, aber ich bin kein Experte.

Danke.

Antwort

1

Warum schreiben Sie nicht Ihre eigene Hilfsmethode? Wie folgt aus:

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}");   
    } 
} 

Verbrauch:

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

Das ist großartig! So ziemlich genau das, wonach ich suche. Vielen Dank. – Man

1

Roman Antwort ist genau das, was ich suchte, aber es ist C#. Nur für den Fall, dass jemand es in VB.NET wie ich machen muss, hier ist wie. Es gibt auch Details über die Methode, in der der Helfer aufgerufen wurde, und die spezifische Zeile aus.

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 

Einen schönen Tag noch.