3 Stimmen

Wie erstelle ich eine generische Routine, um Methoden zu timen?

Ich muss die Ausführung vieler verschiedener Methoden im Kontext einer Anwendung messen.

Natürlich verfügt .NET über die Stopwatch-Klasse, mit der man mit ihren .Start() und .Stop() Methoden leicht einen Abschnitt des Codes zeitlich bestimmen kann.

Die Verwendung der Stopwatch-Klasse erfordert jedoch normalerweise, dass ich jede Methode mit einer Instanz eines Stopwatch-Objekts versehe und Anrufe an seine .Start() und .Stop() Methoden tätige.

Ich muss die Stopwatch-Funktionalität auf buchstäblich Hunderten von Methoden verwenden und möchte nicht jede Methode mit diesem Code verschmutzen. Ich möchte auch die Möglichkeit haben, die Zeiterfassung ein- und auszuschalten.

Gibt es einen einfachen Weg, wie ich eine generische Zeitlösung in meinem eigenen Code implementieren kann? Wenn ja, wie? Code-Profiler machen es, also glaube ich, dass es möglich sein muss.

10voto

L.B Punkte 110059

Nur ein Gedanke. Deklariere eine Methode wie unten

public static long Messen(Aktion aktion)
{
    Stoppuhr sw = Stoppuhr.StartNew();
    aktion();
    return sw.EllapsedMilliseconds;
}

und benutze es wie folgt

var dauer = Messen(() => MeineMethode(param1));

1voto

Peter Davidsen Punkte 658

Sie könnten sich auch mit AOP beschäftigen und dynamisch einen Wrapper für Timing-Methoden erstellen (funktioniert jedoch nur bei nicht-statischen öffentlichen Methoden).

Wenn Sie IoC verwenden, müssen Sie im Grunde genommen nur die Typen mit einem Dekorierer registrieren, der selbstverständlich angepasst und bei Bedarf aktiviert oder deaktiviert werden kann, oder sogar nur für bestimmte Methoden.

Ich habe zuvor Castle:DynamicProxy verwendet, um genau das zu erreichen (sowohl für Timing als auch für Fehlerprotokollierung).

Bearbeitung: ein Beispiel (aus einer alten Version von castle:dynamic proxy)

TimerInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        invocation.Proceed();
        watch.Stop();
        //hier haben Sie den Wert, der zum Protokollieren verwendet werden könnte (was ich annehme, dass Sie möchten)
    }
}

new ProxyGenerator().CreateInterfaceProxyWithTarget(implementedObject, new TimerInterceptor());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X