it-swarm.com.de

Berechnen Sie die Ausführungszeit einer Methode

Mögliches Duplizieren: 
Wie messe ich, wie lange eine Funktion läuft?

Ich habe eine E/A-Zeitnahme-Methode, die Daten von einem Ort an einen anderen kopiert. Wie lässt sich die Ausführungszeit am besten und realsten berechnen? Thread? Timer? Stopwatch? Irgendwelche andere Lösung? Ich möchte das genaueste und möglichst kurz.

423

Stopwatch wurde für diesen Zweck entwickelt und ist eine der besten Methoden zum Messen der Ausführungszeit in .NET.

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Nicht Verwenden Sie DateTime , um die Ausführungszeit in .NET zu messen.


AKTUALISIEREN:

@ Series0ne weist in den Kommentaren darauf hin: Wenn Sie die Ausführung eines Codes wirklich genau messen möchten, müssen Sie die im Betriebssystem integrierten Leistungsindikatoren verwenden. Die folgende Antwort enthält eine schöne Übersicht.

865
Darin Dimitrov

Aus persönlicher Erfahrung kann die Klasse System.Diagnostics.Stopwatch verwendet werden, um die Ausführungszeit einer Methode zu messen. ACHTUNG: Sie ist nicht ganz genau!

Betrachten Sie das folgende Beispiel:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

Beispielergebnisse

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

Jetzt wundern Sie sich; "Warum hat es beim ersten Mal 132 ms gedauert, und die restliche Zeit deutlich weniger?"

Die Antwort ist, dass Stopwatch die Aktivität "Hintergrundrauschen" in .NET nicht kompensiert, z. B. JITing. Wenn Sie Ihre Methode zum ersten Mal ausführen, ist .NET JIT das erste Mal. Die dafür benötigte Zeit wird zur Ausführungszeit addiert. Gleichermaßen verursachen andere Faktoren auch eine unterschiedliche Ausführungszeit.

Was Sie wirklich nach absoluter Genauigkeit suchen sollten, ist Performance Profiling!

Schau dir folgendes an:

Der RedGate ANTS Performance Profiler ist ein kommerzielles Produkt, liefert jedoch sehr genaue Ergebnisse. - Steigern Sie die Leistung Ihrer Anwendungen mit .NET-Profiling

Hier ein StackOverflow-Artikel zum Profiling: - Was sind einige gute .NET-Profiler?

Ich habe auch einen Artikel über das Performance-Profiling mit Stoppuhr geschrieben, das Sie unter - Performance-Profiling in .NET betrachten möchten

61
series0ne

StopWatch class sucht nach der besten Lösung.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Es hat auch ein statisches Feld namens Stopwatch.IsHighResolution . Natürlich ist dies ein Hardware- und Betriebssystemproblem.

Gibt an, ob der Timer auf einer Leistung mit hoher Auflösung basiert Zähler.

24
Soner Gönül

Wenn Sie sich für das Verständnis der Leistung interessieren, ist die beste Antwort die Verwendung eines Profilers.

Andernfalls bietet System.Diagnostics.StopWatch einen Timer mit hoher Auflösung.

17
Jeff Foster

StopWatch verwendet den hochauflösenden Zähler

Die Stoppuhr misst die verstrichene Zeit durch Zählen der Timer-Ticks in der zugrunde liegender Timer-Mechanismus. Wenn die installierte Hardware und der Betrieb System unterstützt einen Leistungszähler mit hoher Auflösung, dann die Die Stoppuhrklasse verwendet diesen Zähler, um die abgelaufene Zeit zu messen. Andernfalls, Die Stopwatch-Klasse verwendet den Systemzeitgeber, um die abgelaufene Zeit zu messen. Benutzen die Felder Frequency und IsHighResolution, um die Genauigkeit zu bestimmen und Auflösung der Stopwatch-Timing-Implementierung.

Wenn Sie IO messen, werden Ihre Zahlen wahrscheinlich durch externe Ereignisse beeinflusst, und ich würde mir so viele Sorgen machen. genauigkeit (wie oben angegeben). Stattdessen würde ich eine Reihe von Messungen durchführen und den Mittelwert und die Verteilung dieser Zahlen berücksichtigen.

7
Brian Agnew
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }

Ich habe die Eigenschaft Environment.TickCount für diesen Zweck verwendet.

int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;
0