4 Stimmen

Wie man genaue Zeiten zum Testen von Leistungszahlen in C# anzeigt

Ich möchte die Geschwindigkeit eines Algorithmus testen, was DateTime Überlastung die genaueste Zeitangabe? (Ich brauche immer noch Tag/Monat/Jahr/Sekunden, aber dann möchte ich auch Millisekunden).

11voto

lexx Punkte 637

Versuchen Sie, dies mit System.Diagnostics.Stopwatch zu tun:

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

4voto

Jon Skeet Punkte 1325502

Andere haben erwähnt Stopwatch was in der Tat eine gute Idee ist. Ich habe jedoch einen anderen Ansatz: Ich versuche, den Algorithmus so lange zu messen, dass die normale Zeitauflösung des Systems ausreicht. (Im Allgemeinen bin ich noch verwenden. Stopwatch da es der richtige Typ für die Aufgabe ist, aber das ist egal). Zum Beispiel, in meinem letzten IO-Prüfung Ich mache mir nur die Mühe, Sekunden zu melden, weil meine Tests Minuten (manchmal eine halbe Stunde) brauchen, um zu laufen. Zu diesem Zeitpunkt sind Millisekunden unangebracht, da sie im Rauschen anderer Prozesse untergehen würden usw.

Es ist natürlich nicht immer möglich, Tests so lange laufen zu lassen, aber wo es möglich ist, ist es eine gute Sache. Bei kürzeren Tests wäre ich vorsichtig mit Benchmarks, die weniger als 5 Sekunden dauern... eine kurze Aktivität eines anderen Prozesses kann einen unverhältnismäßig großen Effekt haben.

Eine weitere Überlegung: Messen Sie die CPU-Zeit anstelle der Wandzeit:

   [DllImport("kernel32.dll")]
   [return: MarshalAs(UnmanagedType.Bool)]
   static extern bool GetProcessTimes(IntPtr hProcess, 
      out FILETIME lpCreationTime, 
      out FILETIME lpExitTime,
      out ulong lpKernelTime,
      out ulong lpUserTime);

   static ulong GetTime(Process process)
   {
       FILETIME lpCreationTime, lpExitTime;
       ulong lpKernelTime, lpUserTime;

       GetProcessTimes(process.Handle, out lpCreationTime,
                       out lpExitTime, out lpKernelTime, out lpUserTime);

       return lpKernelTime + lpUserTime;
   }

1voto

kiswa Punkte 13937

Wie wäre es mit der Verwendung von DateTime.Now.Ticks ?

Speichern Sie den Wert, führen Sie den Algorithmus aus, vergleichen Sie den gespeicherten Wert mit dem aktuellen Wert, und schon haben Sie die Anzahl der Ticks, die für die Ausführung des Algorithmus benötigt wurden.

1voto

Samuel Punkte 36701

Wenn man zwei subtrahiert DateTime Strukturen, erhalten Sie eine TimeSpan Struktur. Verwendung von TimeSpan können Sie den Abstand zwischen den beiden Zeiten ermitteln.

var before = DateTime.Now;
System.Threading.Thread.Sleep(6500);
var after = DateTime.Now;

var timeTaken = after - before;
var secondsTaken = timeTaken.TotalSeconds;
var milisecondsTaken = timeTaken.TotalMiliseconds;

Beachten Sie, dass Sie Folgendes verwenden müssen TotalXXXX um die gesamte XXXX Andernfalls wird es eher dem entsprechen, was ein Mensch wollen würde. In diesem Fall timeTaken.Seconds = 5 mais timeTaken.TotalSeconds = 65 .

0voto

Patrick McDonald Punkte 61826

Es folgt ein Codebeispiel für die Verwendung der Klasse System.Diagnostics.Stopwatch:

Stopwatch sw = Stopwatch.StartNew();
// Put the code here that you want to time
sw.Stop();
long elapsedTime = sw.ElapsedMilliseconds;

DateTime.Ticks ist nur bis auf etwa 15 ms genau und eignet sich daher nicht für die Zeitmessung kurzer Algorithmen.

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