2010-01-06 10 views
5

Ich möchte in der Lage sein, die Zeit zu berechnen, die eine Reihe von Funktionen zur Ausführung benötigen. Ich habe darüber nachgedacht, eine Art Stoppuhrklasse zu verwenden. Ich kann vor und nach jedem Funktionsaufruf starten/stoppen, aber das erscheint mir schrecklich hässlich. Gibt es eine Möglichkeit, dies ohne eine Stoppuhrklasse zu tun? Kann etwas in der Reflections-Klasse dabei helfen?C# 2.0 Ausführungszeit-Timer

Vielen Dank im Voraus für Ihre Eingabe.

+2

Was ist los mit der Stoppuhr (System.Diagnostics.Stopwatch) -Klasse? –

+0

Da ist nichts _wrong_ damit. Wenn das der beste Weg ist, dann geht es mir gut. Ich suche nur etwas dynamischer und wollte vermeiden, dass mein Code mit Start/Stopps übersät ist. –

+0

@Martinho: J.Hendrix möchte jeden einzelnen Funktionsaufruf profilieren. Das ist mit Stopwatch machbar, aber es ist wahrscheinlich nicht die beste Lösung für das lösungsweite Profiling. Beachten Sie, dass die Antworten unten externe Profiler vorschlagen. –

Antwort

3

denke ich, u die Postsharp Weg http://www.postsharp.org/

Ändern Sie den Code in der Stichprobe für dieses man versuchen muss:

public class ProfileMethodsAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionEventArgs eventArgs) 
    { eventArgs.MethodExecutionTag = Stopwatch.StartNew(); } 

    public override void OnExit(MethodExecutionEventArgs eventArgs) 
    { 
    // Here u can get the time 
    Console.WriteLine(((Stopwatch)eventArgs.MethodExecutionTag).ElapsedMilliseconds); 
    } 
} 

Sie können eine beliebige Methode, um die Zeit weg bekommen

+0

+1 Das sieht bisher gut aus. –

2

Ich empfehle den Sponsor der Performance-Tag ... Red Gate Ants. Sie können eine Demoversion abrufen, mit der Ihre App ausgeführt wird, und Ihnen Informationen zur Leistung für jede Zeile und jede Methode bereitstellen, auf die Ihre App während der Profilerstellung trifft.

0

Es gibt verschiedene Timer. System.Timers.Timer wäre eine solche. Aber wie die vorangegangene Antwort nahelegt, sind Sie sicher, dass dies die richtige Lösung für das Problem ist, das Sie tatsächlich angehen wollen?

+0

Nein, ich bin mir nicht sicher. Ich habe ein paar Ideen, aber sehr offen für Vorschläge. Vielen Dank! –

1

Ich denke, Sie sollten über die Verwendung von Code Profiling denken ... Verwenden Sie eine externe Anwendung wie Ants Profiler, um Ihren Code zu profilieren? Ameisen ist von Red Gate und nicht kostenlos, aber ich denke, dass es auch einige freie/Open-Source-Apps gibt.

Einige free/open source profilers here ...

Es ist in Ordnung, ein Verfahren hier und da Stoppuhr aber dafür jede Methode in Ihrer Lösung zu tun versuchen würde schnell unhandlich.

+0

Ich werde Ameisen anschauen. Mein Gedanke war, dass ich ihn mit einer Art Flagge ein- und ausschalten konnte. Ich möchte es in einer Produktionsumgebung ausführen können, um Probleme mit Netzwerk-, SQL- oder anderen E/A-Engpässen zu vermeiden. –

1

Sie könnten die Stoppuhr-Klasse in ein Attribut setzen, um Ihre Methoden zu dekorieren, d. H. Den AOP-Stil. Besuche this

+0

+1 Schön! Ich denke, das ist, was ich suche. Ich habe noch nie eine Methode dekoriert. Wird das in 2.0 funktionieren? Muss ich dem Projekt Referenzen hinzufügen? –