2012-04-11 14 views
30

Ich möchte sehen, wie lange eine Funktion läuft. So habe ich ein Timer-Objekt auf meiner Form, und ich kam mit diesem Code aus:Wie kann ich messen, wie lange eine Funktion läuft?

private int counter = 0; 

// Inside button click I have: 
timer = new Timer(); 
timer.Tick += new EventHandler(timer_Tick); 
timer.Start(); 
Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 
timer.Stop(); 

Und:

private void timer_Tick(object sender, EventArgs e) 
{ 
    counter++; 
    btnTabuSearch.Text = counter.ToString(); 
} 

Aber das ist nichts zu zählen. Warum?

+0

wenn Sie setzen timer.stop() zu verarbeiten beginnt; nach Start() ist normal. Wann muss der Timer gestoppt werden? Wenn die Funktion beendet ist? –

+3

warum nicht Stoppuhr? (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – VJAI

+0

Mögliches Duplikat von [Ausführungszeit des Messcodes] (https://stackoverflow.com/questions/16376191/measuring- code-execution-time) –

Antwort

40

Um zukünftige Probleme mit einem Timer zu vermeiden, hier ist der richtige Code:

timer = new Timer(); 
timer.Tick += new EventHandler(timer_Tick); 
timer.Interval = 1; //set interval on 1 milliseconds 
timer.Enabled = true; //start the timer 
Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 
timer.Enabled = false; //stop the timer 

private void timer_Tick(object sender, EventArgs e) 
{ 
    counter++; 
    btnTabuSearch.Text = counter.ToString(); 
} 

Aber es ist die falsche aproach. Sie müssen die Stopwatch (System.Diagnostic) Klasse verwenden, weil es ein hoher Auflösung Timer ist und das Wort Diagnose sagt alles.

diese So versuchen:

Stopwatch timer = Stopwatch.StartNew(); 

Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 

timer.Stop(); 
TimeSpan timespan = timer.Elapsed; 

btnTabuSearch.Text = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds/10); 
+4

Hinweis: Wenn der Timer auf ein Intervall von 1 ms eingestellt ist, sollten Sie darauf achten, dass Ihr Zähler nicht die Anzahl der Millisekunden ist. Je nach Hardware beträgt das Mindestintervall für einen Timer (auf meinem Computer) etwa 15 ms. Selbst wenn Sie das Intervall auf 1 ms einstellen, wird es nur alle 15 ms oder so ausgelöst. –

+0

Ich werde morgen den Timer versuchen. Ich will nur einen Zähler, um zu sehen, wie viel Zeit vergangen ist, seit ich den Knopf gedrückt habe. –

+1

'var timer = Stoppuhr.StartNew();' <- eine Zeile weniger Code –

10

Der beste Weg zu sehen, wie lange ein bisschen Code benötigt, ist System.Diagnostics.Stopwatch zu verwenden.

Hier ist ein Beispiel:

using System.Diagnostics; 

#if DEBUG 
    Stopwatch timer = new Stopwatch(); 
    timer.Start(); 
#endif 

    //Long running code 

#if DEBUG 
    timer.Stop(); 
    Debug.WriteLine("Time Taken: " + timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'")); 
#endif 

ich die #if DEBUG verwenden Sie die Stoppuhr Code, um sicherzustellen, nicht in die Produktions-Release, aber man konnte ohne es tun.

43

Verwenden Sie keinen Timer - verwenden Sie die Klasse Stopwatch.

var sw = new Stopwatch(); 
Result result = new Result(); 

sw.Start(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 

sw.Stop(); 

// sw.Elapsed tells you how much time passed 
+7

Oder gar 'var sw = Stoppuhr.StartNew();' <- eine Zeile weniger Code –

6

Für eine Funktion Timing, sollten Sie die Verwendung Stopwatch Class

Auch der Grund, Ihre Timer nicht zu zählen ist, weil Sie nicht ein Intervall für sie festgelegt haben.

7

Verwenden Stopwatch von System.Diagnostics:

static void Main(string[] args) 
{ 
    Stopwatch stopWatch = new Stopwatch(); 
    stopWatch.Start(); 
    Thread.Sleep(10000); 
    stopWatch.Stop(); 

    // Get the elapsed time as a TimeSpan value. 
    TimeSpan ts = stopWatch.Elapsed; 

    // Format and display the TimeSpan value. 
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", 
     ts.Hours, ts.Minutes, ts.Seconds, 
     ts.Milliseconds/10); 
    Console.WriteLine("RunTime " + elapsedTime); 
} 
+2

Wäre es nicht einfacher, die Zeit mit 'ts.ToString (" hh: mm: ss.ff ")' oder 'ts.ToString (" G ")'? – Oliver

11

Sie sollten für Timing-Funktionen, um die Stoppuhr-Klasse verwenden.

Versuchen Sie Folgendes:

private int counter = 0; 

// setup stopwatch and begin timing 
var timer = System.Diagnostics.Stopwatch.StartNew(); 

Result result = new Result(); 
result = new GeneticAlgorithms().TabuSearch(parametersTabu, functia); 

// stop timer and get elapsed time 
timer.Stop(); 
var elapsed = timer.Elapsed; 

// display result time 
MessageBox.Show(elapsed.ToString("mm':'ss':'fff")); 
4

Vielleicht könnten Sie eine Methode, wie das schreiben:

public static void Time(Action action) 
{ 
    Stopwatch st = new Stopwatch(); 
    st.Start(); 
    action(); 
    st.Stop(); 
    Trace.WriteLine("Duration:" + st.Elapsed.ToString("mm\\:ss\\.ff")); 
} 

Und es so verwenden:

Time(()=> 
{ 
CallOfTheMethodIWantToMeasure(); 
}); 
7

Visual Studio 2015 2017 Professional und Enterprise verfügt über ein Diagnosetool.Wenn Sie einen Haltepunkt am Ende Ihrer Funktion haben, wird es die Zeit und Dauer unter den Event Registerkarte anzuzeigen, wie in dem Bild gezeigt:

Enter image description here

Sie den Artikel sehen Diagnostic Tools debugger window in Visual Studio 2015 für mehr Einzelheiten.

PS; Bisher unterstützt nur Xamarin, Cross-Plattform-Projekt diese Funktion nicht. Ich wünschte, dass Microsoft diese großartige Funktion auch für Xamarin-Formulare-Projekte bietet.

+0

das war eine lange Zeit – goodies4uall

1

Ich überprüfte und stimmte allen Vorschlägen zu. Aber wir wollten eine generische Implementierung für den Ausführungszeitlogger teilen, bei der wir die Stoppuhrlogik nicht mehrfach implementieren wollen, aber dennoch die Ausführungszeit für mehrere Methoden messen wollen.

Der Hauptgrund dafür, Logger nicht generisch zu implementieren, ist - die Ausführung der Methode ist zwischen stopwatch.Start() und stopwatch.Stop(). Außerdem können wir nach der Ausführung das Methodenergebnis zur weiteren Verarbeitung benötigen.

Um dieses Problem anzugehen, habe ich folgende Beispielimplementierung erstellt, wobei die Ausführungszeit separat protokolliert wird, ohne sie mit dem tatsächlichen Methodenfluss zu mischen.

public static class Helper 
{ 
    public static T Time<T>(Func<T> method, ILogger log) 
    { 
     var stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     var result = method(); 
     stopwatch.Stop(); 
     log.Info(string.Format("Time Taken For Execution is:{0}", stopwatch.Elapsed.TotalMilliseconds)); 
     return result; 
    } 
} 

public class Arithmatic 
{ 
    private ILogger _log; 
    public Arithmatic(ILogger log)//Inject Dependency 
    { 
     _log = log; 
    } 

    public void Calculate(int a, int b) 
    { 
     try 
     { 
      Console.WriteLine(Helper.Time(() => AddNumber(a, b), _log));//Return the result and do execution time logging 
      Console.WriteLine(Helper.Time(() => SubtractNumber(a, b), _log));//Return the result and do execution time logging 
     } 
     catch (Exception ex) 
     { 
      _log.Error(ex.Message, ex); 
     } 
    } 

    private string AddNumber(int a, int b) 
    { 
     return "Sum is:" + (a + b); 
    } 

    private string SubtractNumber(int a, int b) 
    { 
     return "Subtraction is:" + (a - b); 
    } 
} 

public class Log : ILogger 
{ 
    public void Info(string message) 
    { 
     Console.WriteLine(message); 
    } 

    public void Error(string message, Exception ex) 
    { 
     Console.WriteLine("Error Message:" + message, "Stacktrace:" + ex.StackTrace); 
    } 
} 

public interface ILogger 
{ 
    void Info(string message); 
    void Error(string message, Exception ex); 
} 

Aufruf Teil:

static void Main() 
{ 
    ILogger log = new Log(); 
    Arithmatic obj = new Arithmatic(log); 
    obj.Calculate(10, 3); 
    Console.ReadLine(); 
} 
+0

interessante Idee. Danke fürs Schreiben. –

+0

Glaubst du nicht, dass der Code zu viele nicht zusammenhängende Informationen enthält, glaube ich, dass nur die Hilfsmethode und ihre Verwendung in einer Zeile ausreicht – mkb

+0

Einige erweitern, aber Informationen sind nicht unabhängig, wenn man dieses Konzept auf breiter/Unternehmensebene verwenden möchte dann muss er all diese Informationen wie Logger und alles betrachten. Also habe ich gerade den detaillierten Weg der Implementierung erwähnt. –

-1

auf diese Weise versuchen:

this.Cursor = Cursors.WaitCursor; 

    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew(); 

    //YOUR CODE - CALL FUNCTION -- OTHER COMPUTATIONS 

    long elapsed = sw.ElapsedMilliseconds; // or sw.ElapsedTicks 

    this.Cursor = Cursors.Default; 
    lblTimeNew.Text = "Time: " + elapsed.ToString(); 

Für weitere Informationen besuchen Sie die offizielle MSDN-Website

https://msdn.microsoft.com/it-it/library/system.diagnostics.stopwatch(v=vs.110).aspx

1

Aufzeichnung der Zeit, wenn der Strom Schritt

DateTime dtStart = DateTime.Now; 

//Calculate the total number of milliseconds request took (Timespan = to represent the time interval)-> current - started time stamp ... 
//TotalMilliseconds -->Gets the value of the current TimeSpan structure expressed in whole and fractional milliseconds. 
// to measure how long a function is running 
var result=((TimeSpan)(DateTime.Now - dtStart)).TotalMilliseconds.ToString("#,##0.00") + "ms"; 
Verwandte Themen