2016-06-21 10 views
1

Ich möchte versuchen, meinen Code zu optimieren, und ich möchte die Zeit messen, die eine Funktion benötigt.VB NET Wie man am Anfang und am Ende einer Funktion irgendeinen Code ausführt

Ich habe eine Klasse namens Chrono. Also muss ich nur chrono.start am Anfang der Funktion und chrono.stop am Ende hinzufügen. Meine Klasse chan fügt auch die Zeiten hinzu, die es in einer Liste misst, um dann durchschnittliche Zeit, Gesamtzeit zu haben ...

Es funktioniert. Das einzige Problem ist, wenn es in der Mitte der Funktion exit sub oder return gibt. Nicht wirklich ein Problem, ich füge einfach einen Try am Anfang der Funktion hinzu und setze meinen chrono.stop in den finalen Teil. Ich bin mir nicht sicher, ob es wirklich effizient ist, aber es funktioniert.

Also hier ist meine Frage: Ich hätte gerne eine Funktion Funktion Name als Parameter, die automatisch starten und stoppen meine Klasse, wenn diese Funktion aufgerufen wird. Ich habe von Reflection gehört, aber ich habe keine Ahnung, wie ich es benutzen soll. Und es ist wirklich schwer, im Internet nach dieser Frage zu suchen (weil die Wörter zu häufig sind: "mache etwas am Ende einer Funktion")

Um fortzufahren, funktioniert mein Code, kein Problem. Es beschränkt sich nur auf das Hinzufügen von Code zu einer Funktion für einen kurzen Zeitraum (und manchmal vergessen, es zu entfernen).

Thx (Ich bin französisch und ich hoffe verständlich bin)

+1

Der richtige Weg, dies zu tun wäre, einen Profiler zu verwenden, nicht Ihren eigenen Timer zu rollen. –

+0

Ich erinnere mich, dass es eine AOP-Möglichkeit gibt; Wie auch immer, wenn Sie nur die Leistung messen möchten, sollten Sie die VS Diagnostic Tools ausprobieren. EDIT: Obwohl das AOP wird sich anmelden. –

+0

Ich kann den Profiler von Visual Studio verwenden. Allerdings ist das Laden der Anwendung langsamer, und es ist lang, die Ergebnisse zu haben, weil es alles misst. Aber vielleicht gibt es eine Möglichkeit, ihm zu sagen, was zu messen ist ... Ich werde das untersuchen. Kann ich es nicht so machen, wie ich es gefragt habe? –

Antwort

0

Dies ist, wie Sie Reflexion rufen eine Methode mit Namen verwenden können:

using System.Reflection; 

public int InvokeMethod(string name) 
{ 
    int time1 = 1; //call your chrono.start here. 
    Type thisType = this.GetType(); 
    MethodInfo theMethod = thisType.GetMethod(name); 
    theMethod.Invoke(this, new object[] { 1 }); 
    int time2 = 10; //call your chrono.end here. 
    return time2 - time1; 
} 

jedoch ein Problem besteht. Wie werden Sie wissen, welche Parameter an die Funktion übergeben werden sollen? Im obigen Code übergebe ich nur die Ganzzahl 1 (new object[] { 1 }). Dieser Code kann also nicht automatisiert werden. Wenn Sie ihn jedoch manuell für jede Funktion einzeln ausführen, können Sie diese Zeile so ändern, dass die richtigen Argumente übergeben werden und die Funktion funktioniert, ohne dass die Funktion geändert werden muss.

Dies ist Ihre Frage zu beantworten, wie eine Funktion mit Namen durch Reflexion aufgerufen wird. Es ist jedoch viel einfacher, es unter Verwendung eines delegate (oder Fuc<T, tRsult> in .Net v3.5 und höher) aufzurufen.

+0

Hallo. Danke für deine Antwort. Ich möchte jedoch feststellen, wann eine bestimmte Funktion gestartet wird und wann sie beendet wird. Auf diese Weise konnte ich meine Messung unmittelbar vor dem Start der angegebenen Funktion starten und nach der Ausführung stoppen. Ich (ungefähr) kann Delegat verwenden, um eine Funktion von einer anderen Funktion zu starten. –

+0

Ja, im obigen Code, ersetzen Sie die 'int time1 = 1; Zeile mit Ihrem' chrono.start' und dem 'int time2 = 10;' mit Ihrem 'chroho.end' nach, genau wie ich in den Kommentaren gesagt habe und du bekommst genau das, was du wolltest. Sie können genau dasselbe mit deligates erzielen, ersetzen Sie einfach die drei Zeilen zwischen 'time1' und' time2' durch den Aufruf an den Delegaten. –

+0

Darüber hinaus wird das Aufrufen einer Funktion über Reflektion wesentlich langsamer als ein normaler Aufruf dieser Funktion sein, so dass dies Ihre Zeitpläne sicherlich abwerfen wird. Nicht-reale Zeiten sind schlechter als nutzlos. –