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.
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.
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
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.
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.
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.
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;